41

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

4

5 回答 5

54

您需要定义一个实现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,它将自动开始接收事件 :)

于 2008-10-08T11:14:31.270 回答
49

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

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

    @Override
    public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event)
    {
        UserDetails userDetails = (UserDetails) event.getAuthentication().getPrincipal();
        // ...
    }
}
于 2013-08-08T13:56:45.450 回答
26

类似于菲尔的答案,但修改为考虑泛型:

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Override
  public void onApplicationEvent(final AuthenticationSuccessEvent event) {

      // ...

  }

}
于 2012-12-26T16:34:56.220 回答
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

}
于 2011-05-10T22:34:05.460 回答
9

另一种使用方式@EventListener

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

}
于 2019-01-06T16:41:04.467 回答