web-dev-qa-db-ja.com

Spring Securityでユーザーを手動でログアウトする方法は?

おそらく答えは簡単です:春のセキュリティで現在ログインしているユーザーを手動でログアウトするにはどうすればよいですか?呼び出すだけで十分ですか?

SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false); 

67
Erik

Servlet 3.0コンテナでは、Springのログアウト機能がサーブレットと統合されており、HttpServletRequestlogout()を呼び出すだけです。それでも有効な応答コンテンツを記述する必要があります。

ドキュメント(3.2春):

HttpServletRequest.logout()メソッドを使用して、現在のユーザーをログアウトできます。

通常、これは、SecurityContextHolderが消去されること、HttpSessionが無効化されること、「Remember Me」認証がクリーンアップされることなどを意味します。

35
Piotr Müller

あなたのコードが十分かどうかを確認するのは難しいです。ただし、標準のSpring-securityのログアウトの実装は異なります。 SecurityContextLogoutHandlerを見ると、それらが表示されます:

    SecurityContextHolder.clearContext();

さらに、オプションでHttpSessionを無効にします:

    if (invalidateHttpSession) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }

より多くの情報を見つけることができます Spring Securityでのログアウトに関する他の質問 および org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler

66

LogoutFilterで同じコードを使用し、LogoutHandlersを次のように再利用します。

public static void myLogoff(HttpServletRequest request, HttpServletResponse response) {
    CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
    SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
    cookieClearingLogoutHandler.logout(request, response, null);
    securityContextLogoutHandler.logout(request, response, null);
}
20
gibaholms

Webアプリケーションでユーザーをログアウトするには、ログアウトページにリダイレクトすることもできます。その後、LogoutFilterがすべての作業を行います。

ログアウトページのURLは、セキュリティ構成で設定されます。

<sec:http ...>
  ...
  <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
  ...
</sec:http>
10
James

SessionRegistry を次のように使用することもできます。

sessionRegistry.getSessionInformation(sessionId).expireNow();

ユーザーのすべてのセッションで強制的にログアウトする場合は、getAllSessionsメソッドを使用して、各セッション情報のexpireNowを呼び出します。

編集
これには、ConcurrentSessionFilter(またはチェーン内の他のフィルター)が必要です。これはSessionInformationをチェックし、すべてのログアウトハンドラーを呼び出してからリダイレクトを行います。

10
Ritesh

new SecurityContextLogoutHandler().logout(request, null, null);

2
Tiago

最近、Spring-security 3.0.5を使用してログアウト機能を実装する必要がありました。この質問はすでに上記で回答されていますが、私のような初心者ユーザーを確実に助ける完全なコードを投稿します:)

Spring-security.xmlでの構成

 <http auto-config="false" lowercase-comparisons="false" use-expressions="true">
     <custom-filter position="LOGOUT_FILTER" ref="logoutFilter" />
 </http>

<beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
        <beans:constructor-arg name="logoutSuccessHandler" ref="xxxLogoutSuccessHandler" />
    <beans:constructor-arg name="handlers">
        <beans:list>
            <beans:ref bean="securityContextLogoutHandler"/>
            <beans:ref bean="xxxLogoutHandler"/>
        </beans:list>
    </beans:constructor-arg>
    <beans:property name="filterProcessesUrl" value="/logout"/>
</beans:bean>
<beans:bean id="XXXLogoutSuccessHandler" class="com.tms.dis.sso.XXXLogoutSuccessHandler"/>
<beans:bean id="securityContextLogoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">
    <beans:property name="invalidateHttpSession" value="true"/>
</beans:bean>
<beans:bean id="XXXLogoutHandler" class="com.tms.dis.sso.XXXLogoutHandler"/>

ここでは、2つのカスタムクラスを作成しました

  1. Org.springframework.security.web.authentication.logout.LogoutHandlerを実装し、logout()メソッドをオーバーライドするXXXLogoutHandler。
  2. Org.springframework.security.web.authentication.logout.LogoutSuccessHanlderを実装し、onLoguoutSuccess()メソッドをオーバーライドするXXXLogoutSuccessHandler。 XXXLogoutSuccessHandler.onLogoutSuccess()メソッド内で、ユーザーを特定のtargetURLからログアウトするredirectStrategy.sendRedirect()メソッドを呼び出します。
  3. org.springframework.security.web.authentication.logout.SecurityContextLogoutHandlerは、ユーザーセッションを無効にするタスクを実行します。

これが助けてスターターに正しい方向を与えることを願っています

:カスタム実装用のコードを意図的に投稿していません。

2
Nayan

単純にこのようにします(「懸念」によってコメントされたもの):

    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); // concern you

    User currUser = userService.getUserById(auth.getName()); // some of DAO or Service...

    SecurityContextLogoutHandler ctxLogOut = new SecurityContextLogoutHandler(); // concern you

    if( currUser == null ){
        ctxLogOut.logout(request, response, auth); // concern you
    }
2
loulou

右Oledzki、私はコントローラ内で次の例を使用してログアウトし、ユーザーをSpring Security 4.2.3のログインページにリダイレクトします

SecurityContextHolder.clearContext();

if(session != null)
    session.invalidate();

return "redirect:/login";
0
Hany Sakr