[Spring Roo] 08. 認証機能の実装

2014/02/10 1:56 AM
 

前回は、Account作成時に入力されたパスワードを暗号化し、データベースに保存するようにした。

今回は、このAccount情報を使用しての認証機能を実装する。

認証機能の実現には、Spring Securityを使用する。

Spring Securityの追加

まず、Rooを使用して、Spring Securityを追加しよう。 Roo Shellを起動して、 security setup というコマンドを実行する。

いくつかのファイルの追加とアップデートが実行された。

せっかくなのでデフォルトのまま実行して、アクセスしてみよう。

ログイン画面が表示される。

017

ユーザIDとパスワードに、”admin”、”admin”と入力して「SUBMIT」。

018

おなじみのトップ画面が表示される。

019

簡単にログイン機能が実装された。 これは、Rooが作成した汎用のサンプルなので、今回のアプリに合わせて適宜合わせていこう。

設定ファイル(ApplicationContext-security.xml)

このコマンドで作成される最も重要なファイル、applicationContext-security.xmlを見てみよう。このファイルは、applicationContext.xmlと同じ、src/main/resources/META-INF/ディレクトリにある。

この中で重要なのは、12行目〜16行目の、intercept-urlと、21行目〜27行目のauthentication-providerだ。

URLに対するアクセス権の設定(intercept-url)

intercept-urlでは、指定したURLのパターンに対するアクセス権の設定を行う。

サンプル的に“/choice/“/member/“などが書かれているが、先ほどのアクセスで使用されたのは、最後の2行、“/login/“/“だ。

まず、アクセスを試みたURI、”/“を見ると、access=”isAuthenticated()”となっている。/login/を見ると、access=”permitAll”となっている。

アクセス権の設定

hasRole()という表現にすると、ロールを指定することができる。

このアクセス権には、ロールやIPアドレス等、さまざまな制約を列挙できる。以下は一例である。

  • permitAll・・・制限なし
  • isAuthenticated・・・ログインしたユーザのみ許可。
  • hasRole・・・引数に設定したロールのユーザのみ許可(単数)。
  • hasAnyRole・・・引数に設定したロールのユーザのみ許可(複数)。

詳しくは、以下のSpring Securityのリファレンスを。

3.2. Web Security Expressions

ロールの設定

accessに、hasRoleもしくはhasAnyRoleでロールを指定するのだが、Spring Securityが用意するロールの種類は、以下の4つとなっている。

  • ROLE_ADMIN
  • ROLE_STAFF
  • ROLE_USER
  • ROLE_GUEST

これらのロールは、以下のような階層になっている。

ROLE_ADMIN => ROLE_STAFF => ROLE_USER => ROLE_GUEST

つまり、ROLE_ADMINロールのユーザは、ROLE_STAFF、ROLE_USER、ROLE_GUESTの権限も持つ、ということだ。

今回はひとまず、“/login/“/“だけ残して他のintercept-urlを削除し、先に行こう。

認証プロバイダの変更(authentication-provider)

Spring Securityのユーザ認証は、Authentication Providerによって提供される。

認証のためのユーザ情報は、初期設定では、applicationContext-security.xmlのauthentication-providerタグの中のuser-serviceタグ内に直接書かれている(メモリー内認証)が、データベースを使用したり、LDAPを使用したりすることができる。

applicationContext-security.xmlの変更

applicationContext-security.xmlを、以下のように変更する。

ハイライトされた行が、デフォルトからの変更箇所。

authentication-providerタグ内のpassword-encoderでは、前回のパスワードハッシュ生成で使用したBCryptPasswordEncoderを使用することを指している。

jdbc-user-serviceタグの中にある属性は、以下の通り。

  • data-source-ref・・・データベースで認証するためのデータソースへの参照。applicationContext.xmlのdataSource、およびdatabase.propertiesに記述した内容を指している。
  • users-by-username-query・・・認証を行うためのSQL。selectの3番目の列は”enabled”の意味で、今回は全ユーザが有効とした。
  • authorities-by-username-query・・・認定を行うためのSQL。ユーザのロールを取得する。今回は全ユーザが”ROLE_USER”とした。

Spring Securityではユーザの「認証」と「認定」を区別している。Spring Securityのリファレンスの該当項目は2.2.3.

動作確認

さあ、この設定で、前回作成したユーザとしてログインしてみよう。

アクセスすると、ログイン画面が表示される。

022

ログインIDとパスワードを入力。

023

認証が実行され、トップページが表示された。

024

これで、DBのAccount情報を使った認証ができるようになった。



コメントはまだありません

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを書く

WordPress Themes