Spring Securityのカスタム認証失敗ハンドラー

1.概要

このクイックチュートリアルでは、Spring BootアプリケーションでSpring Securityの認証失敗処理をカスタマイズする方法を説明します。目標は、 form login アプローチを使用してユーザーを認証することです _. _

Spring Security および Spring Boot での__Formログインの概要については、https://www.baeldung.com/spring-boot-security-autoconfiguration[this]およびhttps://www.baeldung.com/spring-securityを参照してください。 -login[この]記事、それぞれ。

2.認証と承認

Authentication Authorization は、システムへのアクセスを許可することになると、不可欠で、同じように重要な役割を果たすため、しばしば一緒に使用されます。

しかし、それらは異なる意味を持ち、リクエストを検証するときに異なる制約を適用します。

  • 認証 - __Authorizationの前にある。

受け取った資格情報ユーザー名と パスワードはアプリケーションが認識するパスワードと一致します。 認証 ** __ – __成功したかどうかを確認する

認証されたユーザーは、アプリケーションの特定の機能にアクセスするための権限を持っています

authentication authorization の両方の失敗処理をカスタマイズできますが、このアプリケーションでは、認証失敗に焦点を当てます。

3. Spring Securityの AuthenticationFailureHandler

Spring Security は、デフォルトで認証の失敗を処理するコンポーネントを提供します。

ただし、デフォルトの動作が要件を満たすのに十分ではないシナリオに自分自身を見つけることは珍しくありません。

その場合は、 AuthenticationFailureHandler インターフェース:

public class CustomAuthenticationFailureHandler
  implements AuthenticationFailureHandler {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void onAuthenticationFailure(
      HttpServletRequest request,
      HttpServletResponse response,
      AuthenticationException exception)
      throws IOException, ServletException {

        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        Map<String, Object> data = new HashMap<>();
        data.put(
          "timestamp",
          Calendar.getInstance().getTime());
        data.put(
          "exception",
          exception.getMessage());

        response.getOutputStream()
          .println(objectMapper.writeValueAsString(data));
    }
}

デフォルトでは、 Spring redirects はエラーに関する情報を含む request parameter を使用してログインページに戻ります。

このアプリケーションでは、エラーに関する情報とその発生のタイムスタンプを含む401応答を返します。

デフォルトのコンポーネント以外にも、 Spring には、自分がやりたいことに応じて利用できるコンポーネントを使用する準備が整った人がいます。

別の AuthenticationFailureHandlers に作成することができます。 AuthenticationException のさまざまなインスタンスに対するさまざまな動作 ExceptionMappingAuthenticationFailureHandler ** ユーザーをにリダイレクトします。

_AuthenticationExceptionの fullクラスに応じた特定のURL 名 ForwardAuthenticationFailureHandler_ ** は、ユーザーを

AuthenticationException の種類に関係なく指定されたURL SimpleUrlAuthenticationFailureHandler ** は、次のコンポーネントです。

デフォルトで使用され、それはユーザを指定された____failureUrlにリダイレクトします、そうでなければ、それは単に401応答を返します

カスタム AuthenticationFailureHandler を作成したので、アプリケーションを設定し、__Springのデフォルトハンドラをオーバーライドしましょう。

@Configuration
@EnableWebSecurity
public class SecurityConfiguration
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth
          .inMemoryAuthentication()
          .withUser("baeldung")
          .password("baeldung")
          .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http)
      throws Exception {
        http
          .authorizeRequests()
          .anyRequest()
          .authenticated()
          .and()
          .formLogin()
          .failureHandler(customAuthenticationFailureHandler());
    }

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

__failureHandler() 呼び出しに注意してください。ここで、デフォルトのコンポーネントを使用する代わりに Spring__にカスタムコンポーネントを使用するよう指示できます。

4.まとめ

この例では、 SpringのAuthenticationFailureHandler インターフェースを利用してアプリケーションの認証失敗ハンドラーをカスタマイズしました。

この例の実装はhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-login[the Github project]にあります。

ローカルで実行しているときは、アプリケーションにアクセスしてテストできます。 localhostで:8080