2月20日(金)1、2コマ目
今日、やったこと
Spring Securityで認証アプリケーション作成(前回からのつづき)
今日のホワイトボード
前回は
前回は
- 認証を使えるようにした(ユーザーはデフォルトの”user”のみ)
- 認証が必要なページ、不要なページを分けた
まで作成。
DBのユーザー情報を使って認証
DBに作ったSEC_ユーザーマスタテーブルを使って認証をする。
いくつかクラスを作ったが、以下の関係。
|
| 図 DBでユーザー認証を行うためのクラスたち |
entity/User.java
SEC_ユーザーマスタ情報受け渡し用クラス。
repository/UserRepository.java
JpaRepositoryインタフェースを継承したSEC_ユーザーマスタテーブルアクセス用クラス。
ログイン名列(User.javaではloginnameフィールド)で検索するためのfindByLoginname()メソッドを追加。
JpaRepositoryでは、
findBy + 列名
で、指定列を引数で検索するメソッドを生成してくれる。
config/LoginUserDetails.java
UserDetailsクラス継承クラス。
SpringSecurityはユーザー情報をUserDetails型で扱う。
config/LoginUserDetailsService.java
UserDetailsServiceクラス継承クラス。
SpringSecurityはユーザー情報の取得をUserDetailsService型のインスタンスで行う。
config/SecurityConfig.java
DBに格納されているパスワードはBCryptでハッシュ化されている。
認証時に入力パスワードをハッシュ化する際に利用するpasswordEncoderを用意。
ログイン名からユーザー情報を取得
LoginUserDetailsServiceクラスでは、findByLoginname()でログイン名からユーザー情報を検索。
戻り値はOptional<User>型。
アンラップに成功 -> ログイン成功 -> LoginUserDetailsのインスタンス生成
アンラップに失敗 -> 認証失敗 -> 例外UserNameNotFoundExceptionスローで通知
|
| 図 ログイン名からLoginUserDetailsのインスタンスを取得する |
認証状況で各ページのリンクの表示をコントロール
下図のように、認証状況で”ログイン”、”ログアウト”、”登録”リンクの表示をコントロール。
|
| 図 認証状況と各ページで表示するリンク |
~.htmlで、認証済み?ロールはなに?をSpringSecurityを使って確認するには、タグにsec:authorize属性を使う。
|
| 図 HTMLファイルでSpringSecurityを使う |
トップページのHTMLファイルにリンクを追加。
templates/index.html
実行して確認
①まずはトップページ(index.html)
|
| 図 未認証でトップページ表示 |
②ユーザー”taro”でログイン
|
| 図 ADMINロールユーザーでログイン |
③”ログアウト”リンククリック
|
| 図 ログアウトリンククリック後 |
④ユーザー”kotaro”でログイン
|
| 図 非ADMINロールユーザーでログイン |
問題点
config/SecurityConfig.java
- ログアウトすると、トップページ遷移するように設定。
- 登録画面(create.html)はADMINロールが必要に設定。







