Login Spring security:添加";成功登录事件侦听器时“;

Login Spring security:添加";成功登录事件侦听器时“;,login,spring-security,listener,Login,Spring Security,Listener,我是新来的春天安全。如何添加在用户成功登录时调用的事件侦听器?另外,我需要在这个侦听器中获得某种唯一的会话ID,这应该可以在以后使用。我需要这个ID来与另一台服务器同步。您需要定义一个Springbean来实现 然后,在代码中执行以下操作: ApplicationEvent(ApplicationEvent appEvent)上的公共无效 { if(appEvent instanceof AuthenticationSuccessEvent) { AuthenticationSuccessEve

我是新来的春天安全。如何添加在用户成功登录时调用的事件侦听器?另外,我需要在这个侦听器中获得某种唯一的会话ID,这应该可以在以后使用。我需要这个ID来与另一台服务器同步。

您需要定义一个Springbean来实现

然后,在代码中执行以下操作:

ApplicationEvent(ApplicationEvent appEvent)上的公共无效 { if(appEvent instanceof AuthenticationSuccessEvent) { AuthenticationSuccessEvent事件=(AuthenticationSuccessEvent)appEvent; UserDetails UserDetails=(UserDetails)事件。getAuthentication().getPrincipal(); // .... } }
然后,在applicationContext.xml文件中,只需定义该bean,它就会自动开始接收事件:)

在Grails中,使用Spring安全插件,您可以在Config.groovy中执行此操作:

grails.plugins.springsecurity.useSecurityEventListener = true

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

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

}

与Phill的答案类似,但经过修改以考虑泛型:

公共类AuthenticationListener实现ApplicationListener{
@凌驾
ApplicationEvent上的公共无效(最终身份验证成功事件){
// ...
}
}

AuthenticationSuccessEvent的问题在于,它不会在“记住我”登录时发布。如果您使用的是RememberMe身份验证,请改用InteractiveAuthenticationSuccessEvent,它适用于正常登录和RememberMe登录

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

    @Override
    public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event)
    {
        UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
        // ...
    }
}
@组件
公共类LoginListener实现ApplicationListener{
@凌驾
ApplicationEvent上的公共无效(InteractiveAuthenticationSuccessEvent事件)
{
UserDetails UserDetails=(UserDetails)事件。getAuthentication().getPrincipal();
// ...
}
}

使用
@EventListener的另一种方法

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

}

谢谢刚刚找到AuthenticationSuccessEvent,但正在尝试确定如何注册侦听器。他询问的会话ID如何?@siebmanb只需向侦听器添加
@Autowired HttpSession session
。Spring将注入一个代理,该代理自动委托给更正会话;有人知道如何在此事件中获取当前登录用户吗?我目前使用的是
def springSecurityService=Holders.grailsApplication.mainContext.getBean'springSecurityService';def user=springSecurityService.getPrincipal()
但用户始终为空。非常感谢。编辑:看起来像是执行def user=event.getAuthentication().getPrincipal()工作得很好!谢谢!我试图通过使用auth成功处理程序来实现这一点,但遇到了以下问题:。你的回答拯救了局势!这个真的很简单!喜欢