6

ユーザーセッションを無効化 (またはキック) する必要があります。アプリケーションは、コンテナーごとに 1 人のユーザーのみにユーザー ログインを制限します。

セッションレジストリからremoveSessionInformationを呼び出そうとしましたが、ユーザーのロックを解除しました。そのため、他のユーザーはキックされたセッションのユーザー名でログインできます。

しかし、キックされたそのユーザーの SessionContextHolder はまだです。そのため、保護されたページにアクセスする同じ権限が引き続き付与されます。

指定されたセッションレジストリ情報からSessionContextHolderのプリンシパルを無効化または削除する方法は?

ps : 私の古いアプリケーションでは、HttpSession を保持する UserDomain (UserDetails) に 1 つの変数を指定します。ユーザーをキックする必要がある場合は、指定された UserDomain から HttpSession を無効にします。しかし、春にそれを行う方法がわかりません(HttpSessionよりもSessionContextHolderのプリンシパルを削除する可能性が高くなります)。実装は、SessionRegistryImpl が春に行う方法とほぼ同じです。

4

4 に答える 4

11

Spring Security Concurrency Control を検討することをお勧めします。これを構成して、ユーザーごとの同時セッション数を制限し、その数を超えた場合に既存のセッションを期限切れ (キック) にすることができます。

Spring セキュリティ セッション管理

これは構成のスニペットです (Spring 3):

<http>
    ...
    <session-management>
        <concurrency-control max-sessions="1"/>
    </session-management>
    ...
</http>
于 2011-01-06T22:10:49.770 に答える
7

私はこれがそれを行う方法だと思います:

SecurityContextHolder.getContext().setAuthentication(null)

SecurityContext.setAuthentication(Authentication)Javadocから:

現在認証されているプリンシパルを変更するか、認証情報を削除します。

パラメータ: authentication
- 新しい認証トークン。これ以上認証情報を保存しない場合は null

于 2011-01-06T17:52:48.357 に答える
0

これは私の application-security.xml から抽出されたものです

class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy"
        p:maximumSessions="1" <br>
                    **p:exceptionIfMaximumExceeded="true"** >
        <constructor-arg name="sessionRegistry" ref="sessionRegistry" />

最大セッション数の後に太字の行を追加してみてください

于 2013-09-19T07:03:20.560 に答える