Login Spring security:添加";成功登录事件侦听器时“;
我是新来的春天安全。如何添加在用户成功登录时调用的事件侦听器?另外,我需要在这个侦听器中获得某种唯一的会话ID,这应该可以在以后使用。我需要这个ID来与另一台服务器同步。您需要定义一个Springbean来实现 然后,在代码中执行以下操作: ApplicationEvent(ApplicationEvent appEvent)上的公共无效 { if(appEvent instanceof AuthenticationSuccessEvent) { AuthenticationSuccessEvent事件=(AuthenticationSuccessEvent)appEvent; UserDetails UserDetails=(UserDetails)事件。getAuthentication().getPrincipal(); // .... } }Login Spring security:添加";成功登录事件侦听器时“;,login,spring-security,listener,Login,Spring Security,Listener,我是新来的春天安全。如何添加在用户成功登录时调用的事件侦听器?另外,我需要在这个侦听器中获得某种唯一的会话ID,这应该可以在以后使用。我需要这个ID来与另一台服务器同步。您需要定义一个Springbean来实现 然后,在代码中执行以下操作: ApplicationEvent(ApplicationEvent appEvent)上的公共无效 { if(appEvent instanceof AuthenticationSuccessEvent) { AuthenticationSuccessEve
然后,在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成功处理程序来实现这一点,但遇到了以下问题:。你的回答拯救了局势!这个真的很简单!喜欢