Spring Securityを使ってSpring Bootのログイン機能を実装する

▼この記事をSNSでシェアする▼

スポンサーリンク

スポンサーリンク

Spring Bootを使ってログイン機能を実装する

これやったことなかったのでちょっと今回やってみようと思います。

どうも調べてみると、Spring SecurityでSession管理とかも便利にやってくれるらしい

Qiitaの記事を参考に練習しました。

1. やりたいこと

単純です。大きく分けると二つ。

  1. ログイン機能:DBのUserテーブルにあるユーザー名とパスワードが一致したらログインを許可する
  2. セッション管理:ログインしているユーザーのSession情報をDBのテーブルに格納する

まあここを見ている人の多くは1のやり方を知りたくて実装したいような気がするので、そういう方は1に関する説明のみご覧ください。

1のログイン機能について

login.html(ログイン用のページ)からユーザー名とパスワードを入力して「ログイン」をクリックする。

フォームに入力したユーザーとパスワードの組がDBに存在すればようこそ画面(hello.html)に遷移する

フォームに入力したユーザーとパスワードの組がDBに存在しなければログイン用画面(login.html)を再表示し、エラーメッセージを出す。

2のセッション管理について

ログイン画面からようこそ画面に遷移したユーザーのセッション情報をDBに格納し管理する

Spring Securityのライブラリをプロジェクトに入れて、sessionテーブルとsession_attributesテーブルを作成するSQLを流すだけで実現できる

santaka
こんなに簡単だとは…

あとでやりかたは紹介しますが、SQLは用意されているのですぐにセッション管理できて感動しました。

2. 前提

使っているツールとかを列挙するとこんな感じ

  • OS:macOS 10.13.6(特に開発環境は仮想化していない)
  • エディタ:spring tool suite4.1.2
  • ビルドツール:Gradle
  • フレームワーク:Spring Boot
  • テンプレートエンジン:Thymeleaf
  • DB:Mysql5.7

今回はMysqlで行います。

DBの種類によってセッション管理の際に流すSQLが異なります。(あとでそこも説明します)

のちに紹介するHTMLの実装とかはThymeleafに慣れていないと読みにくいかもしれないです。

ただ今回そこは本題じゃないような気がするので、よさそうな記事リンク貼っときます。

Spring Boot で Thymeleaf 使い方メモ

3. ログイン機能の実装

3.1 概要

  • ログイン用のコントローラ作成:ログイン画面のビューを割り当てる
  • 認証処理クラス作成:ログイン用のURLとか遷移先や認証処理を記述する
  • User情報のService,Bean,Repsitory:Userテーブルのデータを扱う
  • Userテーブル作成:これだけDBの話id, user_name, passwordカラムを用意する

3.2 実装のポイント

https://github.com/Tonbi00080/spboot/pull/18/files

今回の実装の詳細は上記のプルリクをご覧いただくとわかりやすいと思います。

このプロジェクトにいろんな機能を練習で実装しているので、プロジェクト全体を俯瞰してもわかりにくいかもです。

src/main/java/com/example/demo/handler/LogIntercepter.javaの差分は無視してください

build.gradle

重要なのは23,24行目の記述です。

Spring SecurityとSession管理のライブラリを設定します。

application.properties

WebSecurityConfig.java

ここが肝ですね

ログイン画面、ログイン後のhello画面、ログインエラー時のパスを指定しています

configureメソッドではフォームの内容をBcryptで暗号化するメソッドを定義しています。

LoginConfig.java

UserService.java

フォームに入力されたユーザー名とパスワードのレコードがuserテーブルにあれば、UserDetailsインタフェースに対象のユーザー情報を格納し返す認証処理

HelloController.java

認証処理が正常に実行されると、WebSecurityConfig.javaからこのコントローラが呼ばれ、ログイン後のようこそ画面に遷移する

その際に認証済みユーザーの情報を取得し、hello.htmlに表示しています。

3.3 DB

3.3.1  Userテーブル

ちょっとつまづいたのですが、Spring Securityのライブラリを使うときのUserテーブルを作る際にカラム名は以下のように設定しないとうまくいかなかったです。

  • ユーザー名:user_name
  • パスワード:password
このテーブルにレコードを追加すれば、ログインできるようになります。

3.3.2 セッションテーブル

セッションテーブル用のSQLはSpring Projectのレポジトリで公開されているので、そこから使用しているDBに合わせたSQL(schema-[DB名].sql)を流します。

SPRING_SESSION, SPRING_SESSION_ATTRIBUTESテーブルを作成します。

※以下はMysql用のSQL(schema-mysql.sql)

4. セッション管理・画面イメージについて

セッション管理がどのように行われているかを画面イメージとあわせて見てみましょう

ログイン

ログイン後

認証処理が正常に実行されると、セッション情報が保持されます

SPRING_SESSIONテーブル

ログインしているuser2のセッションIDや有効期間が保持されています

最長非アクティブ時間が1800なのでセッションが最後の操作から30分有効であり、それをすぎるとセッション情報が破棄されることがわかります

SPRING_SESSION_ATTRIBUTESテーブル

USER2のセッションスコープの下記の情報が格納されています

  • CSRFトークンの情報:フォームの送信値が正当であるかを判別するCSRF(クロスサイトリフォージェリ)対策のトークン
  • SPRING_SECURITY_CONTEXT

5. まとめ

Spring Security便利で任せていろんなことをやってくれる

中身の処理勉強します

スポンサーリンク


関連記事

▼この記事をSNSでシェアする▼

フォローする

メニュー・主な記事カテゴリ

おすすめ特集!




「ゆとり鳥日記」について
ITを中心に関心の赴くままに好きなように書いていく雑記ブログ!管理人が二人います。
◆フクロウ(ITコンサル)
◆santaka(SE)

詳しいプロフィール
お仕事の依頼・ご要望

ゆとり鳥日記をBTCで応援する