Spring Bootによるウェブアプリ開発: [補足01] ユーザ認証(2)

前回の続き。

アカウントの情報がハードコードだと管理が面倒なので、データベースを使おう。その際、保存するパスワードはハッシュ化しよう。

作成・変更したファイル

今回使うページを次に示す。

パス アクセス制限 備考
/suppl01/admin/ 管理人ロールをもつ登録ユーザ 管理人用トップページ
/suppl01/admin/add_user 管理人ロールをもつ登録ユーザ ユーザ登録フォーム

アカウント情報を格納するテーブル

40.1 User Schemaにあるようにテーブルを作ると、簡単にアカウント情報として利用することができる(もちろん設定をすれば他の構成でも使えるが)。今回は、これを参考に次のSQL命令でテーブルを作ることにする。

40.1 User Schemaからの変更点は以下の通り。

  • passwordカラムは、ハッシュ化したパスワードを保存する為にサイズを100に変更
  • すでに存在している場合は作成しないようにするために「IF NOT EXISTS」を追加

このSQL命令をH2コンソールで実行してもいいし、JdbcTemplateで実行してもいいのだが、ファイルに記述したSQL命令をアプリの起動時に実行する方法(78.3 Initialize a database using Spring JDBC)がある。
今回はこの方法を使うことにし、src/main/resources/schema.sqlを作成する。

WebSecurityConfigurerAdapterを継承した設定用クラス

参考: 5.6.2 JDBC Authentication

  • 16行目: 設定時にJdbcTemplate(かDataSourcedの)インスタンスが必要なので、引数として「JdbcTemplate jdbcTemplate』を追加し、DIコンテナから取得する。
  • 21行目: パスワードのエンコーダとして使うBCryptPasswordEncoderをインスタンス化する。
  • 22行目: JDBCを使った認証で、どのデータベースを使うか(jdbcTemplate.getDataSource())とどのパスワードエンコーダを使うか(passwordEncoder)を指定する。
  • 29行目: 「/suppl01/admin/**」へのアクセスへは管理者ロールを持つアカウントがアクセスできることを指定する。

コントローラ

  • 86行目: SecurityConfiguration.javaと同様にパスワードエンコーダをインスタンス化する。
  • 87ページ: パスワードエンコーダのencodeメソッドを使ってパスワードをエンコードしたものを保存する。
  • 88ページ: ロールをauthoritiesテーブルに保存する。usersテーブルの情報だけではダメなことに注意する。

テンプレート

add_user.html

  • 14行目: ロールは「ROLE_」をつけることに注意する。

動作確認

ハードコードしたadminでログインし、一般ユーザ、管理者ユーザを作成し、それらのユーザで正しくアクセスできること等を確かめてみよう。