Spring Boot セキュリティ関連

Spring Boot上でSpring Securityで認証時にDB上のユーザーを利用してみた

今回は、Spring Securityを利用してユーザー認証を行う際に、データベースから取得したログインユーザーを利用するように修正してみたので、そのサンプルプログラムを共有する。

前提条件

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

Spring Boot上で独自ログイン画面上でSpring Securityの認証を行ってみた今回は、Spring Securityを利用して、独自ログイン画面を作成した上で、Spring Securityの認証処理を実装してみた...

また、Oracleデータベース上に、以下のuser_passテーブルが作成できていること

user_passテーブル作成

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

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

Spring Securityの設定を行うクラスの内容は以下の通りで、「configure(AuthenticationManagerBuilder auth)」メソッドでSpring-Security用のユーザーアカウント情報をデータベースからロードするサービスクラスの呼び出しを行うように変更すると共に、パスワードをBCryptで暗号化するクラスのオブジェクトを作成している。

また、Spring-Security用のサービスクラスの内容は以下の通りで、Spring-Security用のユーザーアカウント情報をデータベースからロードする処理と、ユーザーアカウント情報をデータベースに登録する処理を定義している。

また、Spring-Security用のユーザーアカウント情報を定義しているクラスの内容は以下の通り。

さらに、user_passテーブルにアクセスする処理の内容は以下の通りで、MyBatisを利用するようにしている。

また、コントローラクラスの内容は以下の通りで、ログイン画面を表示するメソッド内で、user_passテーブルにログインユーザーのデータを登録する処理を追加している。

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

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

サンプルプログラムの実行結果は、以下の通り。

1) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下のログイン画面が表示される
サンプルプログラムの実行_1

2) このタイミングで、user_passテーブルを確認すると、名前が「user」で、パスワードが暗号化された値(passを暗号化している)で登録されていることが確認できる
サンプルプログラムの実行_2

3) データベースに登録したユーザーと違うユーザー名またはパスワードを入力し、「ログイン」ボタンを押下
サンプルプログラムの実行_3

4) 以下のように、ログインができず、ログイン画面にエラーメッセージが表示される
サンプルプログラムの実行_4

5) データベースに登録したユーザーと同じユーザー名・パスワードを入力し、「ログイン」ボタンを押下
サンプルプログラムの実行_5

6) 以下のように、ログインでき、検索画面が表示されることが確認できるので、「ログアウト」ボタンを押下
サンプルプログラムの実行_6

7) 以下のように、ログイン画面に遷移することが確認できる
サンプルプログラムの実行_7

要点まとめ

  • WebSecurityConfigurerAdapterクラスを継承したクラス内のconfigure(AuthenticationManagerBuilder auth)メソッドで、userDetailsServiceとpasswordEncoderを指定することで、データベースを利用したSpring-Security用の認証処理を行える。
  • Spring-Security用のユーザーアカウント情報を利用して認証するサービスクラスは、UserDetailsServiceインタフェースを実装して作成する。
  • Spring-Security用のユーザーアカウントは、UserDetailsインタフェースを実装して作成する。