spring-mvc - que - spring security anotaciones
Iniciar sesión programáticamente un usuario utilizando seguridad de primavera (3)
Lo opuesto a: ¿Cómo desconectar manualmente a un usuario con seguridad de primavera?
En mi aplicación, he registrado una nueva pantalla de usuario , que se envía a un controlador que crea un nuevo usuario dentro de db (y realiza algunas comprobaciones obvias). Luego quiero que este nuevo usuario inicie sesión automáticamente ... De alguna manera quiero algo Me gusta esto :
SecurityContextHolder.getContext().setPrincipal(MyNewUser);
Editar bien, casi lo he implementado en función de la respuesta a Cómo registrar el usuario mediante programación con Spring Security 3.1
Authentication auth = new UsernamePasswordAuthenticationToken(MyNewUser, null);
SecurityContextHolder.getContext().setPrincipal(MyNewUser);
Sin embargo, cuando se implementa, jsp no puede acceder a MyNewUser.getWhateverMethods()
mientras que sí lo hace cuando se sigue el procedimiento de inicio de sesión normal. el código que funciona de forma nonal, pero arroja un error cuando se inicia sesión como se indica a continuación:
<sec:authentication property="principal.firstname" />
De la fuente de seguridad de primavera 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);
}
Sin embargo SecurityContextHolder
tenga en cuenta que SecurityContextHolder
generalmente se borra una vez completada la cadena de filtros.
En mi controlador tengo esto, que registra al usuario como de costumbre :
Authentication auth =
new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
Donde el usuario es mi objeto de usuario personalizado (implementando UserDetails) que se acaba de crear. El método getAuthorities()
hace esto (solo porque todos mis usuarios tienen el mismo rol):
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;
}
También puede inyectar la seguridad de su primavera configurada UserDetailsManager
a su controlador y usarla para obtener el UserDetails
que contiene el principal y las autoridades para evitar el código duplicado:
// 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);