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”でログイン

”taro”ユーザーのロールは”ROLE_ADMIN”。よって、”ログアウト”リンクと”登録”リンクも表示される。
図 ADMINロールユーザーでログイン

③”ログアウト”リンククリック

ログアウトして、認証ページが表示さえる。 <= トップページを表示したい。
図 ログアウトリンククリック後

④ユーザー”kotaro”でログイン

”kotaro”ユーザーのロールは”ROLE_USER”。”ログアウト”リンクは表示されるが、”登録”リンクは表示されない。
図 非ADMINロールユーザーでログイン

問題点

以下の問題点がある。
”ログアウト”リンクをクリックすると、ログイン画面に
 => ”ログアウト”リンクをクリックすると、トップページを表示したい。
非ADMINロールユーザーでログイン、登録ページのURLを直接指定すると登録画面が表示される
 =>登録画面表示時に確認

config/SecurityConfig.java

以下を追加。
  • ログアウトすると、トップページ遷移するように設定。
  • 登録画面(create.html)はADMINロールが必要に設定。

登録する

登録画面にて入力後、登録ボタンをクリックすると入力内容でDBに登録する。

templates/create.html

<form>のaction属性で、パス”/create”をリクエストするように設定。

controller/ItemController.java

POSTコマンドでパス"/create"でリクエスト時のメソッド追加。
ItemRepositoryのsave()メソッドでDBに登録される。


今日が最終回

おつかれさまでした。














このブログの人気の投稿

1月15日(木)1コマ目

10月30日(木)1コマ目

12月4日(木)1コマ目