おそらく答えは簡単です:春のセキュリティで現在ログインしているユーザーを手動でログアウトするにはどうすればよいですか?呼び出すだけで十分ですか?
SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false);
?
Servlet 3.0コンテナでは、Springのログアウト機能がサーブレットと統合されており、HttpServletRequest
でlogout()
を呼び出すだけです。それでも有効な応答コンテンツを記述する必要があります。
ドキュメント(3.2春):
HttpServletRequest.logout()メソッドを使用して、現在のユーザーをログアウトできます。
通常、これは、SecurityContextHolderが消去されること、HttpSessionが無効化されること、「Remember Me」認証がクリーンアップされることなどを意味します。
あなたのコードが十分かどうかを確認するのは難しいです。ただし、標準の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
。
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);
}
Webアプリケーションでユーザーをログアウトするには、ログアウトページにリダイレクトすることもできます。その後、LogoutFilterがすべての作業を行います。
ログアウトページのURLは、セキュリティ構成で設定されます。
<sec:http ...>
...
<sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
...
</sec:http>
SessionRegistry を次のように使用することもできます。
sessionRegistry.getSessionInformation(sessionId).expireNow();
ユーザーのすべてのセッションで強制的にログアウトする場合は、getAllSessions
メソッドを使用して、各セッション情報のexpireNow
を呼び出します。
編集
これには、ConcurrentSessionFilter
(またはチェーン内の他のフィルター)が必要です。これはSessionInformationをチェックし、すべてのログアウトハンドラーを呼び出してからリダイレクトを行います。
new SecurityContextLogoutHandler().logout(request, null, null);
最近、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つのカスタムクラスを作成しました
これが助けてスターターに正しい方向を与えることを願っています
注:カスタム実装用のコードを意図的に投稿していません。
単純にこのようにします(「懸念」によってコメントされたもの):
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
}
右Oledzki、私はコントローラ内で次の例を使用してログアウトし、ユーザーをSpring Security 4.2.3のログインページにリダイレクトします
SecurityContextHolder.clearContext();
if(session != null)
session.invalidate();
return "redirect:/login";