はじめに
Springbootにはログイン機能の実装のためにSpringSecurityというライブラリが存在しています。
これにより、より簡単にログイン機能を実装することができます。
今回はこのライブラリの使い方を学んでいきましょう!
Javaでログイン機能を実装する
先ほども紹介したようにSpringbootにはプロジェクトに導入するだけでプロジェクトにログイン機能を付与するSpring Securityという機能が存在します。
次のようにHTMLが存在している場合、Spring Securityを実装するだけでログインを経由しなければ到達できなくなります。


それでは早速ライブラリを導入していきましょう!今回もpom.xmlに追記する形で追加できます。
依存ライブラリの箇所に下記の記述を追加してください

記述したらMaven installを実行してライブラリの導入は完了です。
この状態でサーバを再起動すると、ログイン画面が自動で追加されます。
サーバ起動時のターミナルに下記のようなメッセージが出ていればOKです

ユーザ名はuserで固定されており、パスワードはターミナルに表示されたものになります。
DBとのログイン連携
さて、ここまででログイン画面自体の追加はできましたが、今のままではユーザ名もパスワードも固定されてしまっています。
これでは実用的ではないため、データベースと接続して固定アカウント以外のアカウントを使用できる状態にしましょう。
まずはテーブルの作成です。
下記の要件を満たすテーブル:Usersを作成しましょう
| 名前 | タイプ | プライマリーキー | 備考 |
|---|---|---|---|
| id | serial | Serial型でオートインクリメント | |
| username | varchar(255) | 〇 | |
| password | varchar(255) | ||
| varchar(255) | 〇 |
作成したテーブルにデータを入力すればログインするためのアカウントとして使用することができますが、ここで一つ注意点があります。それは、パスワードは生データではなくハッシュ化が必須であることです。
DBに保存されたパスワードがハッシュ化されていない場合、Spring Securityでは利用できません。
ハッシュ化はSpring Securityの一機能で行うため、こちらは実装が必要になってきます。
新規アカウント作成画面の実装
それでは早速実装していきましょう。掲示板のプロジェクトに追加する形で説明しますが、新規にプロジェクトを作成しても大丈夫です。
まずはモデルから作成します。モデル名はUser.javaです。getter、setterの記述も忘れないようにしましょう

また、ログイン成功した際にユーザ情報を保持しておくためのモデルも作成します。UserDto.javaを作成してください。


また、このUserDto.java内で使用しているNotEmptyのアノテーションを利用できるように追加でライブラリが必要です。
Mavenに下記を追加してください。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
次にリポジトリです。UserRepository.javaで作成します。

サービスクラスも必要になりますので作成します。UserService.javaとUserPrincipal.javaです。




コントローラクラスについてです。LoginController.javaとRegisterController.javaを作成します。

掲示板のプロジェクトに追加する形で作業している人は、ルートURLの調整が必要です。掲示板のトップページのURLを/indexに変更しておきましょう。


次はビューの作成です。二つ作ります。一つはlogin.htmlです。

二つ目はregister.htmlです

そして、セキュリティ設定クラスが今回は必要になります。ログインのメカニズムやパスワードエンコーディング、認可のルールなどを設定します。ファイル名はSecurityConfig.javaです。configフォルダを作成してその中に格納します。


ログイン画面の動作確認
ここまで実装お疲れ様です!問題なく実装できていれば、ログイン画面とアカウント登録画面が作成できていると思います。早速起動して確かめてみましょう!
ログインページ


登録したアカウントでログインができればOKです!また、間違ったパスワードなどを入力して、ログインがはじかれることも確認してみるといいと思います!
