1. 概要

この短いチュートリアルでは、Springセキュリティでログアウトリダイレクトを無効にする方法を詳しく見ていきます。

まず、Springセキュリティでログアウトフローがどのように機能するかについての簡単な背景から始めます。 次に、実際の例を通じて、ログアウトが成功した後にユーザーのリダイレクトを回避する方法を説明します。

2. SpringSecurityでログアウトする

つまり、Spring Securityは、logout()DSLメソッドを介してlogoutメカニズムをすぐにサポートします。 基本的に、 Spring Securityは、ユーザーがデフォルトのログアウトURLである/ logoutにアクセスするとログアウトをトリガーします。

ログアウトURLのデフォルト値は、 Spring Security 4の前の/j_ spring_security_logoutでした。

Spring Securityは、ログアウト後にユーザーを特定のURLにリダイレクトする可能性を提供します。 ただし、この動作を避けたい場合があります。

したがって、これ以上面倒なことはせずに、Springセキュリティでログアウトリダイレクトを無効にするロジックを実装する方法を見てみましょう。

3. SpringSecurityログアウトリダイレクトを無効にする

デフォルトでは、Spring Securityは、ログアウトが成功すると、ユーザーを / login?logoutにリダイレクトします。 したがって、このセクションでは、ログアウト後にユーザーがログインページにリダイレクトされないようにする方法に焦点を当てます。

logoutSuccessUrl()DSLメソッドを使用してデフォルトのリダイレクトURLをオーバーライドできることに注意してください。

ここでの主なポイントは、 / logoutURLがRESTクライアントから呼び出されているときにリダイレクトを回避する方法を示すことです。

実際のところ、 LogoutSuccessHandler インターフェイスは、ログアウトプロセスが正常に実行されたときにカスタムロジックを実行するための柔軟な方法を提供します。

したがって、ここでは、カスタムLogoutSuccessHandlerを使用して、クリーンな200ステータスコードのみを返します。 そうすれば、どのページにもリダイレクトされません。

次に、ログアウトリダイレクトを無効にするために必要なSpringセキュリティ構成を実装しましょう。

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests(authz -> authz
                .mvcMatchers("/login").permitAll()
                .anyRequest().authenticated()
            )
            .logout(logout -> logout
                .permitAll()
                .logoutSuccessHandler((request, response, authentication) -> {
                    response.setStatus(HttpServletResponse.SC_OK);
                }
            );
    }

}

上記の構成で注意すべき重要な部分は、 logoutSuccessHandler()メソッドです。 ご覧のとおり、ラムダ式を使用して、カスタムログアウト成功ハンドラーを定義しています。

LogoutSuccessHandlerインターフェイスの単純な実装クラスを作成し、DSLを使用して logoutSuccessHandler()メソッドに渡すこともできることに注意してください。

4. テスト

すべての要素をまとめたので、 / logout エンドポイントをテストして、すべてが期待どおりに機能することを確認しましょう。

テストでは、MockMvcを使用して/logoutリクエストを送信することに注意してください。

まず、簡単なテストクラスを作成し、その中にMockMvcオブジェクトを挿入しましょう。

public class LogoutApplicationUnitTest {

    @Autowired
    private MockMvc mockMvc;

    // test case

}

それでは、 / logoutエンドポイントをテストするメソッドを書いてみましょう:

@Test
public void whenLogout_thenDisableRedirect() throws Exception {

    this.mockMvc.perform(post("/logout").with(csrf()))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$").doesNotExist())
        .andExpect(unauthenticated())
        .andReturn();
}

最後に、テストコードを分解してみましょう。

  • Perform(post(“ / logout”))は、単純なPOST要求として /logoutエンドポイントを呼び出します
  • with(csrf())は、予期される_csrfパラメーターをクエリに追加します
  • status()はHTTP応答のステータスコードを返します
  • jsonPath()は、HTTP応答の本文にアクセスして検査することを可能にします

5. 結論

要約すると、SpringセキュリティとSpring Bootでログアウトリダイレクトを無効にするという課題に取り組む方法を説明し、説明しました。

いつものように、この記事の完全なソースコードは、GitHubから入手できます。