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プロジェクト]にあります。