1. 序章

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

これは、web.xmlファイルのSpringSecurity構成または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セキュリティ構成

デフォルトでは、SpringSecurityにはExceptionTranslationFilter が定義されており、タイプAuthenticationExceptionおよびAccessDeniedExceptionの例外を処理します。 後者は、 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()メソッドをオーバーライドするクラスを作成する必要があります。

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

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="com.baeldung.security.CustomAccessDeniedHandler" />

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

4. アプリケーション構成

アクセス拒否エラーの処理は、エラーページタグを定義することにより、Webアプリケーションのweb.xmlファイルを介して実行できます。 これには、という2つのサブタグが含まれていますエラーコード、 インターセプトするステータスコードを指定し、 位置、 これは、エラーコードが発生した場合にユーザーがリダイレクトされる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ページを使用してアクセス拒否エラーを処理するさまざまな方法について詳しく説明しました。

記事の完全なソースコードは、GitHubプロジェクトにあります。