Программный вход пользователя в систему с помощью spring безопасности
Противоположность: Как вручную выйти из системы с помощью spring безопасности?
В моем приложении у меня зарегистрирован новый пользовательский экран, который отправляется на контроллер, который создает нового пользователя в db (и делает несколько очевидных проверок). Затем я хочу, чтобы этот новый пользователь был автоматически зарегистрирован... Я добрый чего-то подобного:
SecurityContextHolder.getContext().setPrincipal(MyNewUser);
Edit
Ну, я почти реализован на основе ответа на Как программно зарегистрировать пользователя с помощью spring Security 3.1
Authentication auth = new UsernamePasswordAuthenticationToken(MyNewUser, null);
SecurityContextHolder.getContext().setPrincipal(MyNewUser);
Однако при развертывании jsp не может получить доступ к моему MyNewUser.getWhateverMethods()
, тогда как при обычной процедуре входа в систему. код, который работает номорально, но генерирует ошибку при регистрации, как указано выше:
<sec:authentication property="principal.firstname" />
Ответы
Ответ 1
В моем контроллере у меня есть это, которое регистрирует пользователя как обычно:
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;
}
Ответ 2
Вы также можете добавить свой spring защищенный настроенный 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);
Ответ 3
Из источника безопасности 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
обычно очищается после завершения цепи фильтра.