1概要

Spring SecurityのJava設定サポートは、強力な流暢なAPIを提供します – アプリケーションのセキュリティマッピングとルールを定義するためです。

このクイック記事では、これを一歩進めて実際にカスタム設定プログラムを定義する方法を説明します。これはカスタムロジックを標準のセキュリティ設定に導入するための高度で柔軟な方法です。

ここでの簡単な例として、特定のエラーステータスコードのリストに応じて、認証されたユーザーのエラーを記録する機能を追加します。


2カスタム

SecurityConfigurer


configurerの定義を始めるには、まず

AbstractHttpConfigurer

クラスを拡張する必要があります** 。

public class ClientErrorLoggingConfigurer
  extends AbstractHttpConfigurer<ClientErrorLoggingConfigurer, HttpSecurity> {

    private List<HttpStatus> errorCodes;

   //standard constructors

    @Override
    public void init(HttpSecurity http) throws Exception {
       //initialization code
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
       http.addFilterAfter(
         new ClientErrorLoggingFilter(errorCodes),
         FilterSecurityInterceptor.class);
    }
}

ここで、私たちがオーバーライドする必要がある主なメソッドは

configure()

method ** です – これはこのconfigurerが適用されるセキュリティ設定を含みます。

この例では、最後のSpring Securityフィルタの後に新しいフィルタを登録しました。また、レスポンスステータスのエラーコードを記録するつもりなので、記録するエラーコードを制御するために使用できる

errorCodes List

プロパティを追加しました。

オプションで

init()

メソッドに追加の設定を追加することもできます。これは

configure()

メソッドの前に実行されます。

次に、カスタム実装に登録するSpring Securityフィルタクラスを定義しましょう。

public class ClientErrorLoggingFilter extends GenericFilterBean {

    private static final Logger logger = LogManager.getLogger(
      ClientErrorLoggingFilter.class);
    private List<HttpStatus> errorCodes;

   //standard constructor

    @Override
    public void doFilter(
      ServletRequest request,
      ServletResponse response,
      FilterChain chain)
      throws IOException, ServletException {
       //...

        chain.doFilter(request, response);
    }
}

これは、

GenericFilterBean

を拡張し、

doFilter()

メソッドをオーバーライドする標準のSpringフィルタクラスです。メッセージを表示するために使用するロガーを表す2つのプロパティと、

errorCodes.



List

があります。


doFilter()

メソッドを詳しく見てみましょう。

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth == null) {
    chain.doFilter(request, response);
    return;
}
int status = ((HttpServletResponse) response).getStatus();
if (status < 400 || status >= 500) {
    chain.doFilter(request, response);
    return;
}
if (errorCodes == null) {
    logger.debug("User " + auth.getName() + " encountered error " + status);
} else {
    if (errorCodes.stream().anyMatch(s -> s.value() == status)) {
        logger.debug("User " + auth.getName() + " encountered error " + status);
    }
}

ステータスコードがクライアントエラーステータスコード(400〜500)の場合は、

errorCodes

リストを確認します。

これが空の場合は、クライアントのエラーステータスコードが表示されます。

それ以外の場合は、まずエラーコードがステータスコードの

List

の一部であるかどうかを確認します。


3カスタム設定ツールの使用

これでカスタムAPIが完成しました。

Beanを定義してから、

HttpSecurityの

apply()__メソッドを使用して

Spring Security構成に追加できます。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
         //...
          .and()
          .apply(clientErrorLogging());
    }

    @Bean
    public ClientErrorLoggingConfigurer clientErrorLogging() {
        return new ClientErrorLoggingConfigurer() ;
    }
}

記録したいエラーコードの特定のリストを使ってBeanを定義することもできます。

@Bean
public ClientErrorLoggingConfigurer clientErrorLogging() {
    return new ClientErrorLoggingConfigurer(Arrays.asList(HttpStatus.NOT__FOUND)) ;
}

そしてそれだけです!これで、セキュリティ設定にカスタムフィルタが含まれ、ログメッセージが表示されます。

カスタムconfigureをデフォルトで追加したい場合は、

META-INF/spring.factories

ファイルを使用できます。

org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer = com.baeldung.dsl.ClientErrorLoggingConfigurer

手動で無効にするには、

disable()

メソッドを使います。

----//...
.apply(clientErrorLogging()).disable();
----


4結論

このクイックチュートリアルでは、Spring Securityの設定サポートの高度な機能に焦点を当てました –

独自のカスタム

SecurityConfigurer


を定義する方法を見ました。

いつものように、この例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-5-security[GitHubでの使用]にあります。