tutorial que proyecto mvc español crear anotaciones spring-mvc spring-security

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);