web-dev-qa-db-ja.com

Springのセキュリティ:「成功したログインイベントリスナー」を追加する

Spring Securityは初めてです。ユーザーが正常にログインしたときに呼び出されるイベントリスナーを追加するにはどうすればよいですか?また、このリスナーで何らかの固有のセッションIDを取得する必要があります。このIDは、さらに利用可能になるはずです。別のサーバーと同期するには、このIDが必要です。

37
axk

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を定義するだけで、イベントの受信が自動的に開始されます:)

49
user7094

AuthenticationSuccessEventの問題は、remember-meログインで公開されないことです。 remember-me認証を使用している場合は、代わりにInteractiveAuthenticationSuccessEventを使用してください。これは、通常のログインとremember-meログインの両方で機能します。

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

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

フィルの回答に似ていますが、ジェネリックスを考慮するように変更されています。

public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Override
  public void onApplicationEvent(final AuthenticationSuccessEvent event) {

      // ...

  }

}
24
user1857829

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

}
10

@EventListenerを使用する別の方法

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

}
1
Sujit