Spring Boot セキュリティ関連

Spring Boot上でSpring Securityのエラー処理を追加してみた

今回は、Spring Securityでエラーが発生した場合に、エラー画面に遷移する処理を追加してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

Spring Boot上でリクエスト毎にCSRFトークンを変える処理を複数画面を開く場合に対応してみた以前、Spring Securityを利用して、さらにリクエスト毎にCSRFトークンの値を変更するようにしたことがあったが、このプログラ...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

Spring Securityの設定を行うクラスの内容は以下の通りで、configure(HttpSecurity http)メソッド内に、エラー発生時にエラー画面に遷移する処理を追加している。

また、検索画面の内容は以下の通りで、「新しい画面を開く(エラー確認用)」ボタンを追加している。

さらに、「新しい画面を開く処理(エラー確認用)」ボタン押下時に開く画面の内容は以下の通りで、windowNameをパラメータに設定しないことで、「次へ」ボタン押下時にエラーが発生するようにしている。

また、「new_window1_error.html」で「次へ」ボタン押下時にエラーが発生しない場合の、遷移先画面の内容は以下の通り。

さらに、エラー画面の内容は以下の通り。

また、コントローラクラスに追加する内容は以下の通りで、新しく追加した画面の遷移処理とエラー画面遷移処理を追加している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-security-error-handling/demo

サンプルプログラムの実行結果

Spring Securityの設定を行うクラスでエラーハンドリングを行う前の動作は以下の通りで、エラー時はSpring Bootデフォルトのホワイトラベルエラーページが表示される。

1) Spring Bootアプリケーションを起動し、「http://(サーバー名):(ポート番号)/」とアクセスすると、以下のログイン画面が表示されるので、ユーザー名・パスワードを入力し「ログイン」ボタンを押下
サンプルプログラムの実行結果_1_1

2) 検索画面に遷移するので、「新しい画面を開く」ボタンを押下
サンプルプログラムの実行結果_1_2

3) 以下のように、以前の画面とは別に「新規オープン画面1」が開くことが確認できるので、「次へ」ボタンを押下
サンプルプログラムの実行結果_1_3

4) 以下のように、新規オープン画面2に遷移するので、「閉じる」ボタンを押下
サンプルプログラムの実行結果_1_4

5) 以下のように、確認ダイアログが表示されるので、「はい」ボタンを押下
サンプルプログラムの実行結果_1_5

6) 検索画面で、「新しい画面を開く(エラー確認用)」ボタンを押下
サンプルプログラムの実行結果_1_6

7) 「新規オープン画面1」が開くことが確認できるので、「次へ」ボタンを押下
サンプルプログラムの実行結果_1_7

8) エラーハンドリングを行っていないので、以下のように、Spring Bootデフォルトのホワイトラベルエラーページが表示される
サンプルプログラムの実行結果_1_8

また、Spring Securityの設定を行うクラスでエラーハンドリングを行った後の動作は以下の通りで、エラー時はエラー画面に遷移する。

1) Spring Bootアプリケーションを起動し、「http://(サーバー名):(ポート番号)/」とアクセスすると、以下のログイン画面が表示されるので、ユーザー名・パスワードを入力し「ログイン」ボタンを押下
サンプルプログラムの実行結果_2_1

2) 検索画面に遷移するので、「新しい画面を開く(エラー確認用)」ボタンを押下
サンプルプログラムの実行結果_2_2

3) 「新規オープン画面1」が開くことが確認できるので、「次へ」ボタンを押下
サンプルプログラムの実行結果_2_3

4) エラーハンドリングによって、以下のエラー画面に遷移することが確認できる
サンプルプログラムの実行結果_2_4

要点まとめ

  • Spring Securityでエラーが発生した場合に、エラー画面に遷移する処理を追加するには、Spring Securityの設定を行うクラスの内のconfigure(HttpSecurity http)メソッド内で、「exceptionHandling().accessDeniedPage(“/エラー画面へのパス”)」を追加すればよい。