2011-02-23 7 views
5

Estoy usando el siguiente método en un controlador de primavera para permitir la autenticación a través de Ajax. Funciona, pero no parece crear una cookie ni nada que haga que la autenticación sea persistente.¿Es posible autenticar mediante programación con Spring Security y hacerlo persistente?

@RequestMapping(method = RequestMethod.POST) 
@ResponseBody 
public LoginStatus login(@RequestParam("j_username") String username, 
         @RequestParam("j_password") String password) { 

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password); 

    try { 
     Authentication auth = authenticationManager.authenticate(token); 
     SecurityContextHolder.getContext().setAuthentication(auth); 
     return new LoginStatus(auth.isAuthenticated(), auth.getName()); 
    } catch (BadCredentialsException e) { 
     return new LoginStatus(false, null); 
    } 
} 

¿Qué debo hacer para que la autenticación sea persistente?

+0

Matt: ¿Alguna vez te diste cuenta de esto? Estoy tratando de hacer exactamente lo mismo ahora. Vamos a probar este código de los foros de Spring Security: http://forum.springsource.org/showthread.php?99183-Automatic-login-after-account-creation – les2

+0

Sí, consulte el siguiente comentario y publíquelo para la solución: http : //raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery#comment-1300943308000 –

Respuesta

2

Asegúrese

  • tiene SecurityContextPersistenceFilter configurado
  • no está configurando create-session atributo de la etiqueta para <security:http>none.
+0

Traté de ver la lógica en SecurityContextPersistenceFilter y de replicarla. Agregué una referencia a SecurityContextRepository e intenté llamar a su método saveContext() después de autenticar al usuario. Todavía no hay dados. –

+0

¿No sería más fácil para usted configurar la cadena de filtro de Spring Security de forma estándar en lugar de imitarla? Por cierto, tenga en cuenta el 'javadoc' SecurityContextPersistenceFilter': _Este filtro DEBE ejecutarse ANTES de cualquier mecanismo de procesamiento de autenticación. Los mecanismos de procesamiento de autenticación (por ejemplo, BASIC, filtros de procesamiento CAS, etc.) esperan que SecurityContextHolder contenga un SecurityContext válido para el momento en que se ejecutan_. Esto significa que la creación y el almacenamiento del contexto deben ocurrir _prior_ para realizar la autenticación. –

+0

Utilicé con éxito esta técnica para hablar con j_security_check y hacer que funcione tan bien como la implementación de LoginService. Sin embargo, todavía tengo los mismos problemas para lograr que el inicio de sesión HTTPS persista en HTTP. Creé una rama j_security_check en el proyecto GitHub para intentar que esta implementación alternativa funcione. https://github.com/mraible/ajax-login/tree/j_security_check –

Cuestiones relacionadas