Программно зарегистрировать пользователя, используя весеннюю безопасность

Противоположность: Как вручную вывести пользователя с весной безопасности?

В моем приложении у меня зарегистрирован новый пользовательский экран , который отправляет на controller, который создает нового пользователя в db (и делает несколько очевидных проверок). Затем я хочу, чтобы этот новый пользователь был автоматически зарегистрирован … Я вроде хочу somethign как это :

SecurityContextHolder.getContext().setPrincipal(MyNewUser); 

Редактирование Ну, я почти реализован на основе ответа на вопрос о том, как программно регистрировать пользователя с помощью Spring Security 3.1

  Authentication auth = new UsernamePasswordAuthenticationToken(MyNewUser, null); SecurityContextHolder.getContext().setPrincipal(MyNewUser); 

Однако при развертывании jsp не может получить доступ к моему MyNewUser.getWhateverMethods() тогда как при обычной процедуре входа в систему. код, который работает номенклатурно, но генерирует ошибку при входе в систему, как указано выше:

  

В моем controllerе у меня есть это, которое регистрирует пользователя как обычно :

 Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(auth); 

Где пользователь – пользовательский пользовательский объект (реализующий UserDetails), который только что создан. Метод getAuthorities() делает это (только потому, что все мои пользователи имеют ту же роль):

 public Collection getAuthorities() { //make everyone ROLE_USER Collection grantedAuthorities = new ArrayList(); GrantedAuthority grantedAuthority = new GrantedAuthority() { //anonymous inner type public String getAuthority() { return "ROLE_USER"; } }; grantedAuthorities.add(grantedAuthority); return grantedAuthorities; } 

Вы также можете UserDetailsManager свой controller безопасности UserDetailsManager к своему controllerу и использовать его, чтобы получить UserDetails который содержит принципала и полномочия, чтобы избежать дублирования кода:

 // inject @Autowired private UserDetailsManager manager; // use in your method UserDetails userDetails = manager.loadUserByUsername (token.getUsername ()); Authentication auth = new UsernamePasswordAuthenticationToken (userDetails.getUsername (),userDetails.getPassword (),userDetails.getAuthorities ()); SecurityContextHolder.getContext().setAuthentication(auth); 

Из источника безопасности пружины AbstractAuthenticationProcessingFilter :

 protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException { if (logger.isDebugEnabled()) { logger.debug("Authentication success. Updating SecurityContextHolder to contain: " + authResult); } // you need this SecurityContextHolder.getContext().setAuthentication(authResult); rememberMeServices.loginSuccess(request, response, authResult); if (this.eventPublisher != null) { eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass())); } successHandler.onAuthenticationSuccess(request, response, authResult); } 

Однако обратите внимание, что SecurityContextHolder обычно очищается по завершении цепочки фильтров.

Давайте будем гением компьютера.