1. 概要

この記事では、Springセキュリティリソースサーバーによって生成されたSpringセキュリティ例外を処理する方法について説明します。 そのために、必要なすべての構成を説明する実際的な例も使用します。 まず、Springセキュリティについて簡単に紹介します。

2. 春のセキュリティ

Springセキュリティは、Springプロジェクトの一部であるライブラリです。 Springプロジェクトのユーザーアクセス制御のすべての機能をグループ化しようとします。 アクセス制御により、アプリケーション上の特定のユーザーまたはロールのセットで実行できるオプションを制限できます。 この方向では、 Spring Securityは、ビジネスロジックへの呼び出しを制御するか、特定のURLへのHTTP要求のアクセスを制限します。 これを念頭に置いて、セキュリティレイヤーの動作をSpringSecurityに指示してアプリケーションを構成する必要があります。

この例では、例外ハンドラーの構成に焦点を当てます。 Spring Securityは、この目的を達成し、生成されるイベントを制御するために、3つの異なるインターフェイスを提供します。

  • 認証成功ハンドラー
  • 認証失敗ハンドラー
  • アクセス拒否ハンドラー

まず、構成を詳しく見てみましょう。

3. セキュリティ構成

まず、WebSecurityConfigurerAdapterクラスを拡張する必要のある構成クラスがあります。 これは、アプリケーションのすべてのセキュリティ構成の管理を担当します。 したがって、ここでハンドラーを紹介する必要があります。

一方では、必要な構成を定義します。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf()
      .disable()
      .httpBasic().disable()
      .authorizeRequests()
      .antMatchers("/login").permitAll()
      .antMatchers("/customError").permitAll()
      .antMatchers("/access-denied").permitAll()
      .antMatchers("/secured").hasRole("ADMIN")
      .anyRequest().authenticated()
      .and()
      .formLogin()
      .failureHandler(authenticationFailureHandler())
      .successHandler(authenticationSuccessHandler())
      .and()
      .exceptionHandling()
      .accessDeniedHandler(accessDeniedHandler())
      .and()
      .logout();
    }
}

“ / login” “ / customError”、“ / access-denied”などのリダイレクトURLはそれらにアクセスするためのあらゆるタイプの制限があります。 したがって、 permitAll()として注釈を付けます。

一方、処理できる例外のタイプを定義するBeanを定義する必要があります。

@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
    return new CustomAuthenticationFailureHandler();
} 

@Bean
public AuthenticationSuccessHandler authenticationSuccessHandler() {
   return new CustomAuthenticationSuccessHandler();
}

@Bean
public AccessDeniedHandler accessDeniedHandler() {
   return new CustomAccessDeniedHandler();
}

AuthenticationSuccessHandler はハッピーパスを処理するため、例外の場合に残りの2つのBeanを定義します。 これらの2つのハンドラーは、私たちのニーズに合わせて実装する必要があるハンドラーです。 それでは、それぞれの実装を進めましょう。

4. 認証失敗ハンドラー

一方では、AuthenticationFailureHandlerインターフェースがあります。 これは、ユーザーがログインに失敗したときに生成される例外を管理するを担当します。 このインターフェイスは、ハンドラロジックをカスタマイズするための onAuthenticationFailure()メソッドを提供します。ログイン試行に失敗すると、SpringSecurityによって呼び出されます。 これを念頭に置いて、ログインに失敗したときにエラーページにリダイレクトするように例外ハンドラーを定義しましょう。

public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) 
      throws IOException {
        response.sendRedirect("/customError");
    }
}

5. アクセス拒否ハンドラー

一方、権限のないユーザーが安全なページまたは保護されたページにアクセスしようとすると、SpringSecurityはアクセス拒否の例外をスローします。 Springセキュリティで利用できるデフォルトの403アクセス拒否ページがあります。これはカスタマイズできます。 これは、AccessDeniedHandlerインターフェースによって管理されます。 さらに、ユーザーを403ページにリダイレクトする前にロジックをカスタム化するためのhandle()メソッドを提供します

public class CustomAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException {
        response.sendRedirect("/access-denied");
    }
}

6. 結論

このクイック記事では、 Springセキュリティ例外を処理する方法と、クラスを作成およびカスタマイズしてそれらを制御する方法を学習しました。 さらに、説明されている概念を理解するのに役立つ完全に機能する例を作成しました。

記事の完全なソースコードは、GitHubでから入手できます。