2013年2月9日
by DiceK Mikami
最近はコード書くよりRedmineとにらめっこしています。
こんにちわ、DiceK Mikamiです。
Grailsの2.2.0がリリースされましたね。
今回は2.2.0を使って、OpenID実装のチュートリアルを実践してみたいと思います。
検証環境
- Java: JDK1.7.0
- Grails:
2.2.02.2.0 RC2
プラグインのインストール
OpenID環境の実装には、Spring Security OpenIDプラグインを利用します。
このプラグインはSpring Security Coreを中核としたOpenID用プラグインです。
さて、ここで一つ大問題があります。
なんと現在(2013/02/07)、Spring Security CoreがV2.2.0で動きません。
ちゃんとチュートリアル通りに動かしても以下のようなエラーが返ってきます。

なんでしょうか。
私の環境が悪いのでしょうか。
それとも日々の行いが悪いからでしょうか。
へこみます。
一体私が何をしたというのだ!
気を取り直して、ここでは2.2.0 RC2を使うことにします。(なぜかRC版では動くのです)
さっそくコマンドプロンプトからアプリ作成します。
$ grails create-app openidsample
$ cd openidsample
次に、プラグインをインストールしていきましょう。
と、いきたいところですが、しばしお待ちください。
チュートリアルでは、サクッとプラグインをインストールしていますが、この通りにやっても動きません。
ここはチュートリアルに掲載されていない重要な作業です!
プラグインの中では、Google Guice2.0を利用しているのですが、セントラルリポジトリにありません。
インストールページには、BootConfig.groovyにリポジトリを追加しろと記載されていますが、残念なことにこんなことでは動かないのです。
理由は不明ですが、どうやらリポジトリのURLが2.0のものではないようです。
仕方ないので、自前でGoogle Guice2.0を用意しましょう。
guice-2.0.jarというファイルが必要になりますので、「 guice-2.0.jar download 」とかで検索すればダウンロードサイトがヒットすると思います。
そこからダウンロードしてください。
ダウンロードしたguice-2.0.jarを以下の画像にあるフォルダに入れておきます。

このフォルダに入れておくとローカルライブラリとしてGrailsが勝手に処理してくれます。
ここまでの作業が終わりましたら、プラグインをインストールします。
$ grails install-plugin spring-security-openid
spring-security-openidはspring-security-coreに依存しているんで、勝手にそちらもインストールしてくれます。
余談ですが、私の環境ではインストールしてくれませんでした。ので、別途spring-security-coreをインストールしました。嫌われているのでしょうか。
雛形の作成
Grailsは最近の流行りよろしくほとんどがコマンドで作成できます。
もう障害はないので、雛形をバリバリ作っていきます。
$ grails s2-quickstart com.openidsample User Role
$ grails s2-init-openid
$ grails s2-create-persistent-token com.openidsample.PersistentLogin
$ grails s2-create-openid com.openidsample.OpenID
ここで作成されるファイル群は、サーバ側のアカウント管理、OpenIDとの紐付け、トークン管理を行うクラスです。
雛形の改良
単純にコマンドだけでは、OpenIDとの紐付けは行ってくれませんので、OpenID用にカスタマイズする必要があります。
grails-app/domain/com/openidsample/User.groovy
package com.openidtest
class User {
String username
String password
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired
// hasManyを追加する
static hasMany = [openIds: OpenID]
static constraints = {
username blank: false, unique: true
password blank: false
}
static mapping = {
password column: '`password`'
}
ー後略ー
}
次に、BootStrap.configでロールなどを追加しておきます。
grails-app/conf/BootStrap.groovy
import com.openidsample.Role
import com.openidsample.User
import com.openidsample.UserRole
class BootStrap {
def springSecurityService
def init = { servletContext ->
String password = 'password'
def roleAdmin = new Role(authority: 'ROLE_ADMIN').save()
def roleUser = new Role(authority: 'ROLE_USER').save()
def user = new User(username: 'user', password: password, enabled: true).save()
def admin = new User(username: 'admin', password: password, enabled: true).save()
UserRole.create user, roleUser
UserRole.create admin, roleUser
UserRole.create admin, roleAdmin, true
}
}
一緒にユーザーも作っています。
これはローカルサーバーのユーザーです。
次にURLマッピングも若干変更します。
これはSpring Security Coreが作成したログイン画面ではなく、OpenID用のログイン画面に遷移させるために行います。
grails-app/conf/UrlMappings.groovy
class UrlMappings {
static mappings = {
"/login/auth" {
controller = 'openId'
action = 'auth'
}
"/login/openIdCreateAccount" {
controller = 'openId'
action = 'createAccount'
}
ー後略ー
}
}
テスト用ファイルの作成
次にテスト用にセキュアなページを作っておきます。
$ grails create-controller secure
内容は簡単にロールによって表示ページを分けるようにします。
grails-app/controllers/openidsample/SecureController.groovy
package openidsample
import grails.plugins.springsecurity.Secured
class SecureController {
// 管理ユーザー用
@Secured(['ROLE_ADMIN'])
def admins = {
render 'Logged in with ROLE_ADMIN'
}
// 一般ユーザー用
@Secured(['ROLE_USER'])
def users = {
render 'Logged in with ROLE_USER'
}
}
実験
ここまで作成しましたら、あとは実験してみます。
$ grails run-app
起動しましたら、 http://localhost:8080/openidsample/secure/users にブラウザからアクセスしてみましょう。

ログインできていないので、上画面のようなログインページが表示されると思います。
今回はGoogleを利用しようと思いますので、テキストボックスにGoogleのOpenID用URLを入れてログインしましょう。
Google OpenID用URL: https://www.google.com/accounts/o8/id
指示の通り操作を行うと、ローカルサーバーのトップ画面に戻ってきます.
途中でアカウントを作るように促されますが、これはローカルサーバーのアカウントとの紐付けを行うためのものです。
再度 http://localhost:8080/openidsample/secure/users にブラウザからアクセスします。
以下のような画面が表示されれば成功です。

ひとまずチュートリアルとしてはこのような感じとなります。
認証サーバーのURLは固定ですのでそれをボタンにしたり、紐づけたアカウントに管理権限をつけたりと言った改造を施せば簡単にOpenID連携をしたアプリを構築できると思います。
プラグインがもう少し安定すれば実践でも使っていけるでしょう。
参考URL
http://grails-plugins.github.com/grails-spring-security-openid/