Spring Security - 403禁止/アクセス拒否ページをカスタマイズする

1前書き

この記事では、Spring Securityプロジェクトのアクセス拒否ページをカスタマイズする方法を説明します。

これは、 web.xml ファイル内のSpring Security設定またはWebアプリケーション設定のいずれかによって実現できます。

残りのセクションでは、これらの各オプションについて詳しく説明します。

2カスタムJSP

自分が持っていないロールに制限されているページにユーザーがアクセスしようとすると、アプリケーションはステータスコード403を返します。これは__アクセスが拒否されたことを意味します。

Spring 403ステータスレスポンスページをカスタムのものに置き換えるには、まず accessDenied.jsp という JSP ファイルを作成します。

<body>
<h2>Sorry, you do not have permission to view this page.</h2>

Click <a href="<c:url value="/homepage.html"/> ">here</a>
to go back to the Homepage.
</body>

3 Springのセキュリティ設定

デフォルトでは、Spring Securityは AuthenticationException AccessDeniedException の例外を処理する ExceptionTranslationFilter を定義している。後者は、 AccessDeniedHandlerImpl クラスを使用する__accessDeniedHandlerという名前のプロパティを通じて行われます。

この動作をカスタマイズして上記で作成した独自のページを使用するには、 ExceptionTranslationFilter クラスのプロパティをオーバーライドする必要があります。これは、Java構成またはXML構成のどちらでも実行できます。

3.1. アクセス拒否ページ

Javaを使用して、 HttpSecurity 要素を設定しながら、 accessDeniedPage() メソッドまたは accessDeniedHandler() メソッドを使用して403エラー処理プロセスをカスタマイズできます。

“/admin/ ” URLを ADMIN ロールに制限し、アクセス拒否ページをカスタムの accessDenied.jsp ページに設定する認証設定を作成しましょう。

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
     //...
      .and()
      .exceptionHandling().accessDeniedPage("/accessDenied.jsp");
}

アクセス拒否ページの同等のXML設定を見てみましょう。

<http use-expressions="true">
    <access-denied-handler error-page="/accessDenied"/>
 </http>

3.2. アクセス拒否ハンドラ

ページの代わりにアクセス拒否ハンドラを使用すると、403ページにリダイレクトする前に実行するカスタムロジックを定義できるという利点があります。このためには、 AccessDeniedHandler インターフェースを実装し、__handle()メソッドをオーバーライドするクラスを作成する必要があります。

試みを行ったユーザーとアクセスしようとしていた保護されたURLを含む、アクセスが拒否されたすべての試みについて警告メッセージをログに記録するカスタム AccessDeniedHandler クラスを作成しましょう。

public class CustomAccessDeniedHandler implements AccessDeniedHandler {

    public static final Logger LOG
      = Logger.getLogger(CustomAccessDeniedHandler.class);

    @Override
    public void handle(
      HttpServletRequest request,
      HttpServletResponse response,
      AccessDeniedException exc) throws IOException, ServletException {

        Authentication auth
          = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null) {
            LOG.warn("User: " + auth.getName()
              + " attempted to access the protected URL: "
              + request.getRequestURI());
        }

        response.sendRedirect(request.getContextPath() + "/accessDenied");
    }
}

セキュリティー構成では、Beanを定義し、カスタムの AccessDeniedHandler を設定します。

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

上で定義された CustomAccessDeniedHandler クラスを XML を使用して設定したい場合、設定は少し異なります。

<bean name="customAccessDeniedHandler"
  class="org.baeldung.security.CustomAccessDeniedHandler"/>

<http use-expressions="true">
    <access-denied-handler ref="customAccessDeniedHandler"/>
</http>

4アプリケーション構成

  • アクセス拒否エラーの処理は、 error-page タグを定義することによって、Webアプリケーションの web.xml ファイルを介して行うことができます。エラーコードが発生した場合にユーザーがリダイレクトされるURLを示します。

<error-page>
    <error-code>403</error-code>
    <location>/accessDenied</location>
</error-page>

Spring Bootの場合のようにアプリケーションが web.xml ファイルを持っていない場合、Springアノテーションは現在 error-page タグに代わるものを提供していません。 Springのドキュメントによると、この場合、推奨されるアプローチは、セクション3で提示されているメソッド accessDeniedPage()および accessDeniedHandler()を使用することです。

5結論

このクイック記事では、カスタム403ページを使用してアクセス拒否エラーを処理できるさまざまな方法について詳しく説明しました。

この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-login[GitHubプロジェクト]にあります。