SpringSecurity 403エラーページをカスタマイズする

# はじめに
SpringSecurity その4です。前回からの続きになっています。
今回はエラーページをカスタマイズしていきます。

# SpringSecurityシリーズ　項目表
|NO  |タイトル                    |
|----|--------------------------|
|その1|[SpringSecurity 導入から基本的な認証フロー](https://qiita.com/ryo0527/items/dbdbb2a476cc74e9116b)|
|その2|[SpringSecurity ログインページをカスタマイズする](https://qiita.com/ryo0527/items/2ee963cea31e82fd3dc5)|
|その3|[SpringSecurity DBアクセス処理](https://qiita.com/ryo0527/items/0b0b161530a2f0eb9e0c)|
|その4|[SpringSecurity 403エラーページをカスタマイズする](https://qiita.com/ryo0527/items/065c1a871c80e55d2935)|

前回からの続きになっている為、その1から順にご覧ください。

# 現在の課題
アクセス権限の設定を行なったページに権限のないアカウントでアクセスすると、<br />「Whitelabel Error Page」が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309433/1af13e9c-c797-49f5-a539-2feadb7ec0c7.png)

403エラーは権限がない場合などに発生するエラーです。<br />`/admin` は、ADMIN権限を持ったアカウントのみがアクセスできるよう設定を行なっています。
この章では、エラーの際に用意したページが表示されるように実装していきます。

# 実装
### SpringSecurityの設定
エラーの際に用意したページが表示されるように設定を追加します。
```java:SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  <!-- 中略 -->

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    // アクセス権限の設定
    http.authorizeRequests()
        // 制限なし
        .antMatchers("/", "/login*", "/logout").permitAll()
        // '/admin'は、'ADMIN'ロールのみアクセス可
        .antMatchers("/admin").hasRole("ADMIN")
        // 他は制限あり
        .anyRequest().authenticated();
    // ログイン処理の設定
    http.formLogin()
        // ログイン処理のURL
        .loginPage("/login")
        // usernameのパラメータ名
        .usernameParameter("user")
        // passwordのパラメータ名
        .passwordParameter("password")
        // ログイン失敗時の遷移先URL
        .failureForwardUrl("/login-error");
    // ログアウト処理の設定
    http.logout()
        // ログアウト処理のURL
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        // ログアウト成功時の遷移先URL
        .logoutSuccessUrl("/login")
        // ログアウト時に削除するクッキー名
        .deleteCookies("JSESSIONID")
        // ログアウト時のセッション破棄を有効化
        .invalidateHttpSession(true);
    // エラー処理の設定　　　　
    http.exceptionHandling().accessDeniedPage("/error");
  }

 <!-- 中略 -->

}
```
追加したのは、`http.exceptionHandling().accessDeniedPage("/error");`のみです。
これでエラーの際に指定したページが表示されるようになります。
`accessDeniedPage(...)`で表示させたいページを指定します。

### 画面遷移用ページの用意
ページ遷移の確認用に、必要最小限のエラーページを用意します。
#### View
```HTML:error.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8">
    <title>errorページ</title>
  </head>
  <body>
    <h1>errorページ</h1>
    <p>アクセス権限が不足 or URLが正しく入力されていない</p>
    <a href="/">トップページに戻る</a>
  </body>
</html>
```
# 動作確認
アクセス権限の有無でそれぞれ動作確認を行います。
### アクセス権限があるアカウント
アクセス権限があるアカウントでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309433/bd719a34-1466-565f-bf10-86faafe3ed5f.png)

権限設定されたページにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309433/ac7d1d25-20a7-d148-2a9b-2b69d740e02c.png)


### アクセス権限がないアカウント
アクセス権限がないアカウントでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309433/0b4fb246-e98f-fef9-9c19-d836e324712e.png)

権限設定されたページにアクセスできません。エラーページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2309433/c819e4bb-e442-e9d7-5b1b-c724f2b4684d.png)

# おわりに
これでSpringSecurityの403エラーページをカスタマイズすることができました。
間違っている箇所ありましたら、ご指摘いただければ幸いです。