Spring安全性:添加“成功登录事件监听器”

时间:2008-10-08 11:05:22

标签: login spring-security listener

我是Spring Security的新手。如何添加将在用户成功登录时调用的事件侦听器?此外,我需要在此侦听器中获取某种唯一的会话ID,该ID应该可以进一步使用。我需要此ID与其他服务器同步。

5 个答案:

答案 0 :(得分:46)

您需要定义一个实现ApplicationListener

的Spring Bean

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

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

        // ....
    }
}

然后,在applicationContext.xml文件中,只需定义该bean,它就会自动开始接收事件:)

答案 1 :(得分:42)

AuthenticationSuccessEvent的问题是它不会在remember-me登录时发布。如果您使用的是remember-me身份验证,请使用InteractiveAuthenticationSuccessEvent,它适用于正常登录以及记住我的登录。

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

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

答案 2 :(得分:24)

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

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Override
  public void onApplicationEvent(final AuthenticationSuccessEvent event) {

      // ...

  }

}

答案 3 :(得分:10)

在Grails中,使用Spring Security Plugin,您可以在Config.groovy中执行此操作:

grails.plugins.springsecurity.useSecurityEventListener = true

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

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

}

答案 4 :(得分:1)

使用@EventListener

的另一种方法
@EventListener
public void doSomething(InteractiveAuthenticationSuccessEvent event) { // any spring event
    // your code 

}