ユーザ認証: ユーザ情報をデータベースに保存する

単純なログインでは、ユーザ情報をソースコードに記述し、実行時はAuthenticationManagerBuilderによって作られるメモリ上のデータベースに保存するようになっています。これではユーザの追加のたびにソースコードの修正が必要になってしまうので、ユーザ情報をデータベースに置くように変えていきましょう(参考: 3.5. Authentication)。また、ブラウザからサインアップできるようなインターフェースを作成します。

JDBC Authentication

WebSecurityConfig.javaを次のように修正します。

  • 19行目: /signupもユーザ認証無しでアクセスできるようにする。
  • 25,26行目: データベースを使うのでDataSourceをDIします。
  • 30行目: AuthenticationManagerBuilderのjdbcAuthenticationメソッドでデータベースからユーザ情報を読み取ることを指定します。dataSourceメソッドで利用するDataSourceを指定します。

3.5.2. JDBC Authenticationでは、withDefaultSchemaメソッドを実行しています。これは、ユーザ情報用のテーブルを用意してくれる機能ですが、ここではこの機能を使わずEntityを自分で作成することにします。

EntityとRepository

ユーザ情報を格納するEntityと、Entityを扱うRepositoryを作成します。

  • 11行目: AuthenticationManagerBuilderはテーブル名が「USERS」となっているテーブルから取得するためテーブル名を明示的に指定する(@Tableアノテーションを指定しない場合、テーブル名はクラス名と同じになる)。
  • 14〜23行目: username、password、enabledという3つのフィールド(テーブルのcolumn)が必要となる。Lombokでgetter/setterを生成する。

Userと同様に、Authorityを作成する。

View

Sign up

Controller

  • 1〜4行目: RepositoryをDIする。
  • 6〜9行目: @RequestParamでmethodを指定するとメソッド毎に処理を分けることができる。GETの場合はviewを指定するだけ。
  • 11〜23行目: POSTの場合は送られてきたパラメータを使ってUserとAuthorityのインスタンスを生成し、データベースにセーブする。

これは最も単純な場合なので、すでに同じユーザ名で登録されていた場合の処理がされていない、パスワードが平文で保存されている等いろいろ修正しなければなりませんが、とりあえずはこれでユーザ情報を登録して認証に使えるようになります。