Программный вход пользователя с помощью spring security
противоположное: как вручную выйти из системы пользователя с spring security?
в моем приложении у меня есть зарегистрировать новый экран пользователя, который посылается в контроллер, который создает нового пользователя в БД (и делает несколько очевидных проверок).Затем я хочу, чтобы этот новый пользователь будет автоматически зарегистрирован ... Я вроде как хочу что-то вроде этого :
SecurityContextHolder.getContext().setPrincipal(MyNewUser);
Edit Ну я почти реализовал на основе ответа на How to программно войдите в систему с помощью Spring Security 3.1
Authentication auth = new UsernamePasswordAuthenticationToken(MyNewUser, null);
SecurityContextHolder.getContext().setPrincipal(MyNewUser);
однако при развертывании jsp не может получить доступ к my MyNewUser.getWhateverMethods()
в то время как это происходит, когда обычная процедура входа в систему следует. код, который работает номинально, но выдает ошибку при входе в систему, как показано выше, ниже:
<sec:authentication property="principal.firstname" />
3 ответа:
в моем контроллере у меня есть это, который регистрирует пользователя в как обычно:
Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(auth);
где пользователь - это мой пользовательский объект пользователя(реализация UserDetails), который был недавно создан. Элемент
getAuthorities()
метод делает это (только потому, что все мои пользователи имеют ту же роль):public Collection<GrantedAuthority> getAuthorities() { //make everyone ROLE_USER Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(); GrantedAuthority grantedAuthority = new GrantedAuthority() { //anonymous inner type public String getAuthority() { return "ROLE_USER"; } }; grantedAuthorities.add(grantedAuthority); return grantedAuthorities; }
вы также можете ввести свой spring security настроен
UserDetailsManager
к вашему контроллеру и использовать его, чтобы получить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);
из источника безопасности spring
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
обычно очищается после завершения цепочки фильтров.