2008-10-08 32 views
32

Soy nuevo en Spring Security. ¿Cómo agrego un detector de eventos que se llamará cuando el usuario inicie sesión con éxito? También necesito obtener algún tipo de identificación de sesión única en este oyente, que debería estar disponible más adelante. Necesito este ID para sincronizar con otro servidor.Seguridad de primavera: agregar "On successful event event listener"

Respuesta

41

Debe definir un Spring Bean que implemente ApplicationListener.

Luego, en el código, hacer algo como esto:

public void onApplicationEvent(ApplicationEvent appEvent) 
{ 
    if (appEvent instanceof AuthenticationSuccessEvent) 
    { 
     AuthenticationSuccessEvent event = (AuthenticationSuccessEvent) appEvent; 
     UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal(); 

     // .... 
    } 
} 

A continuación, en el archivo de applicationContext.xml, acaba de definir que el frijol y se iniciará automáticamente la recepción de eventos :)

+0

Gracias! Acabo de encontrar AuthenticationSuccessEvent, pero estaba tratando de descubrir cómo registrar un oyente. – axk

+2

¿qué pasa con la ID de la sesión que estaba preguntando? – siebmanb

+1

@siebmanb solo agrega '@Autowired HttpSession session' al oyente. Spring inyectará un proxy que automáticamente delega a la sesión de corrección. –

10

En Grails , con el complemento de seguridad de la primavera, se puede hacer esto en Config.groovy:

grails.plugins.springsecurity.useSecurityEventListener = true 

grails.plugins.springsecurity.onAuthenticationSuccessEvent = { e, appCtx -> 

     def session = SecurityRequestHolder.request.getSession(false) 
     session.myVar = true 

} 
+0

Forma correcta de obtener la solicitud en Config.groovy def request = RequestContextHolder? .currentRequestAttributes(); – openSource

+1

¿Alguien sabe cómo obtener el usuario conectado actual en este caso? Actualmente estoy usando 'def springSecurityService = Holders.grailsApplication.mainContext.getBean 'springSecurityService'; def user = springSecurityService.getPrincipal() 'pero el usuario siempre es nulo. ¡Gracias! EDITAR: Parece que hacer def user = event.getAuthentication(). GetPrincipal() funciona muy bien! – Dinoo

21

similar a la respuesta de Phill, pero modificado para tener en cuenta los genéricos:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(final AuthenticationSuccessEvent event) { 

     // ... 

    } 

} 
38

El problema con AuthenticationSuccessEvent es que no se publica en el inicio de sesión de remember-me. Si está utilizando la autenticación Remember-Me use InteractiveAuthenticationSuccessEvent, funciona para el inicio de sesión normal y para el inicio de sesión de Remember-me.

@Component 
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> { 

    @Override 
    public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) 
    { 
     UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal(); 
     // ... 
    } 
} 
+1

¡Muchas gracias! Intenté lograr esto utilizando auth-success-handler, pero me enfrenté a este problema: http://stackoverflow.com/questions/11575860/remember-me-and-authentication-success-handler. Tu respuesta rescató la situación! – yname