Pergunta

Eu sou novo para Spring Security. Como faço para adicionar um ouvinte de evento que será chamado como um usuário se conecta com sucesso? Também eu preciso para obter algum tipo de identificação de sessão exclusiva nesta ouvinte que deverá estar disponível mais adiante. Eu preciso deste ID para sincronizar com outro servidor.

Foi útil?

Solução

Você precisa definir um bean Spring que implementa ApplicationListener .

Em seguida, no seu código, fazer algo como isto:

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

        // ....
    }
}

Então, em seu arquivo applicationContext.xml, apenas se define que feijão e ele vai começar a receber automaticamente eventos:)

Outras dicas

O problema com AuthenticationSuccessEvent é ele não ter publicado em lembrar-me login. Se você estiver usando lembro-me de autenticação usar InteractiveAuthenticationSuccessEvent em vez disso, ele funciona para login normal, bem como para lembrar-me login.

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

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

Semelhante a resposta de Phill, mas modificado para levar genéricos em consideração:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Override
  public void onApplicationEvent(final AuthenticationSuccessEvent event) {

      // ...

  }

}

Em Grails, com Spring Security Plugin, você pode fazer isso em Config.groovy:

grails.plugins.springsecurity.useSecurityEventListener = true

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

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

}

Outra forma usando @EventListener

@EventListener
public void doSomething(InteractiveAuthenticationSuccessEvent event) { // any spring event
    // your code 

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top