3

Spring Security とセッションの無効化についての質問です。

ConcurrentSessionControlStrategy によってセッションが無効化されると、セッションは removeSessionInformation メソッドを呼び出すことによって SessionRegistry から削除されますが、セッションが手動ログアウトによって無効化されると、HttpSession は無効化されますが、そこからエントリを削除するための SessionRegistry への呼び出しはありません。

HttpSessionDestroyedEvent イベントをキャプチャするリスナーとして HttpSessionEventPublisher を追加しましたが、SessionRegistry への呼び出しはありません。

LogoutFilter の独自の実装を作成し、手動で removeSessionInformation を呼び出すハンドラーを追加することでこれを回避しましたが、可能であれば標準のスプリング アノテーションを使用できるようにしたいと考えています。(注: セッションは既に無効化されているため、標準のログアウト タグの success-handler-ref フィールドは使用できないため、セッション ID にアクセスできません)

ここに欠けているものはありますか、それともSpringが見逃したものですか?

ちなみに、これはSpring Security 3.1.0を使用しています。

4

1 に答える 1

2

私も同じ問題を抱えていました。私の場合、解決策はSessionRegistry別のSpring Beanとして作成することでした。ConcurrentSessionControlStrategyレジストリへのリンクを保持しているため、無効なセッションをレジストリから直接削除できます。ただし、サーブレットコンテナからサーブレットイベントが提供されるようにSecurityContextLogoutHandler使用しますが、Spring Bean ではない場合、Spring コンテキストによって発行されません。session.invalidate()sessionDestroyedHttpSessionEventPublisherHttpSessionDestroyedEventHttpSessionEventPublisherSessionRegistry

このセキュリティ構成は機能しませんでした:

...
SessionRegistry sessionRegistry = new SessionRegistryImpl();
ConcurrentSessionControlStrategy concurrentSessionControlStrategy = new ConcurrentSessionControlStrategy(sessionRegistry);
...

これはうまくいきます:

@Bean
public SessionRegistry sessionRegistry() {
    return new SessionRegistryImpl();
}
...
ConcurrentSessionControlStrategy concurrentSessionControlStrategy = new ConcurrentSessionControlStrategy(sessionRegistry())
...
于 2012-10-23T20:33:09.827 に答える