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