Spring Securityは初めてです。ユーザーが正常にログインしたときに呼び出されるイベントリスナーを追加するにはどうすればよいですか?また、このリスナーで何らかの固有のセッションIDを取得する必要があります。このIDは、さらに利用可能になるはずです。別のサーバーと同期するには、このIDが必要です。
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を定義するだけで、イベントの受信が自動的に開始されます:)
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();
// ...
}
}
フィルの回答に似ていますが、ジェネリックスを考慮するように変更されています。
public class AuthenticationListener implements ApplicationListener<AuthenticationSuccessEvent> {
@Override
public void onApplicationEvent(final AuthenticationSuccessEvent event) {
// ...
}
}
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
}
@EventListener
を使用する別の方法
@EventListener
public void doSomething(InteractiveAuthenticationSuccessEvent event) { // any spring event
// your code
}