1. 概要

この記事は、フォームログインチュートリアルに基づいて作成されており、SpringSecurityを使用してログアウトを構成する方法に焦点を当てます。

2. 基本構成

logout()メソッドを使用したSpringLogout機能の基本構成は非常に簡単です。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
          //...
          .logout()
          //...
   }
   //...
}

そして、XML構成を使用します。

<http>

    ...    
    <logout/>

</http>

この要素は、デフォルトのログアウトメカニズムを有効にします。これは、次の logouturlを使用するように構成されています。 4

3. JSPとログアウトリンク

この簡単な例を続けると、Webアプリケーションでログアウトリンクを提供する方法は次のとおりです。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
   <head></head>
   <body>
      <a href="<c:url value="/logout" />">Logout</a>
   </body>
</html>

4. 高度なカスタマイズ

4.1. logoutSuccessUrl()

ログアウトプロセスが正常に実行されると、SpringSecurityはユーザーを指定されたページにリダイレクトします。 デフォルトでは、これはルートページ(“ /” )ですが、これは構成可能です。

//...
.logout()
.logoutSuccessUrl("/afterlogout.html")
//...

これは、XML構成を使用して実行することもできます。

<logout logout-success-url="/afterlogout.html" />

アプリケーションによっては、ユーザーをログインページにリダイレクトすることをお勧めします。

//...
.logout()
.logoutSuccessUrl("/login.html")
//...

4.2. logoutUrl()

Spring Securityの他のデフォルトと同様に、ログアウトメカニズムを実際にトリガーするURLにもデフォルトがあります– /logout

ただし、このデフォルト値を変更して、アプリケーションを保護するために使用されているフレームワークに関する情報が公開されていないことを確認することをお勧めします。

.logout()
.logoutUrl("/perform_logout")

そしてXMLを通して:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout" />

4.3. invalidateHttpSessionおよびdeleteCookies

これらの2つの高度な属性は、セッションの無効化と、ユーザーがログアウトしたときに削除されるCookieのリストを制御します。 そのため、 invalidateHttpSession を使用すると、ログアウト時にセッションが無効にならないようにセッションを設定できます(デフォルトでは true です)。

deleteCookiesメソッドも簡単です。

.logout()
.logoutUrl("/perform_logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")

そしてXMLバージョン:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID" />

4.4. logoutSuccessHandler()

名前空間の柔軟性が十分でない、より高度なシナリオでは、SpringContextのLogoutSuccessHandlerBeanをカスタム参照に置き換えることができます。

@Bean
public LogoutSuccessHandler logoutSuccessHandler() {
    return new CustomLogoutSuccessHandler();
}

//...
.logout()
.logoutSuccessHandler(logoutSuccessHandler());
//...

同等のXML構成は次のとおりです。

<logout 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID"
  success-handler-ref="customLogoutSuccessHandler" />

...
<beans:bean name="customUrlLogoutSuccessHandler" />

ユーザーが正常にログアウトしたときに実行する必要のあるカスタムアプリケーションロジックは、カスタムログアウト成功ハンドラーを使用して実装できます。 たとえば、ユーザーがログアウトをトリガーしたときに最後に表示されたページを追跡する単純な監査メカニズム:

public class CustomLogoutSuccessHandler extends 
  SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {

    @Autowired 
    private AuditService auditService; 

    @Override
    public void onLogoutSuccess(
      HttpServletRequest request, 
      HttpServletResponse response, 
      Authentication authentication) 
      throws IOException, ServletException {
 
        String refererUrl = request.getHeader("Referer");
        auditService.track("Logout from: " + refererUrl);

        super.onLogoutSuccess(request, response, authentication);
    }
}

また、このカスタムBeanには、ログアウト後にユーザーが転送される宛先を決定する責任があることに注意してください。 このため、logoutSuccessHandler属性とlogoutSuccessUrlのペアリングは機能しません。どちらも、同様の機能をカバーしているためです。

5. 結論

この例では、Spring Securityを使用して簡単なログアウトサンプルを設定することから始め、次に、利用可能なより高度なオプションについて説明しました。

このSpringLogoutチュートリアルの実装は、 GitHubプロジェクトにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。

プロジェクトがローカルで実行される場合、サンプルHTMLには次の場所からアクセスできます。

http:// localhost:8080 / spring-security-mvc-login / login.html