Spring security: adding “On successful login event listener”

后端 未结 5 2321
隐瞒了意图╮
隐瞒了意图╮ 2020-12-01 01:42

I\'m new to Spring Security. How do I add an event listener which will be called as a user logs in successfully? Also I need to get some kind of unique session ID in this li

相关标签:
5条回答
  • 2020-12-01 01:58

    In Grails, with Spring Security Plugin, you can do this in Config.groovy:

    grails.plugins.springsecurity.useSecurityEventListener = true
    
    grails.plugins.springsecurity.onAuthenticationSuccessEvent = { e, appCtx ->
    
            def session = SecurityRequestHolder.request.getSession(false)
            session.myVar = true
    
    }
    
    0 讨论(0)
  • 2020-12-01 02:02

    Similar to Phill's answer, but modified to take Generics into consideration:

    public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {
    
      @Override
      public void onApplicationEvent(final AuthenticationSuccessEvent event) {
    
          // ...
    
      }
    
    }
    
    0 讨论(0)
  • 2020-12-01 02:06

    The problem with AuthenticationSuccessEvent is it doesn't get published on remember-me login. If you're using remember-me authentication use InteractiveAuthenticationSuccessEvent instead, it works for normal login as well as for remember-me login.

    @Component
    public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {
    
        @Override
        public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event)
        {
            UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
            // ...
        }
    }
    
    0 讨论(0)
  • 2020-12-01 02:08

    You need to define a Spring Bean which implements ApplicationListener.

    Then, in your code, do something like this:

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

    Then, in your applicationContext.xml file, just define that bean and it will automatically start receiving events :)

    0 讨论(0)
  • 2020-12-01 02:12

    Another way using @EventListener

    @EventListener
    public void doSomething(InteractiveAuthenticationSuccessEvent event) { // any spring event
        // your code 
    
    }
    
    0 讨论(0)
提交回复
热议问题