GrailsでOpenIDのチュートリアル

| コメントをどうぞ

最近はコード書くより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で動きません。
ちゃんとチュートリアル通りに動かしても以下のようなエラーが返ってきます。

grailsopenid02
なんでしょうか。
私の環境が悪いのでしょうか。
それとも日々の行いが悪いからでしょうか。
へこみます。
一体私が何をしたというのだ!

気を取り直して、ここでは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を以下の画像にあるフォルダに入れておきます。

grailsopenid01

このフォルダに入れておくとローカルライブラリとして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 にブラウザからアクセスしてみましょう。

grailsopenid03

ログインできていないので、上画面のようなログインページが表示されると思います。
今回はGoogleを利用しようと思いますので、テキストボックスにGoogleのOpenID用URLを入れてログインしましょう。

Google OpenID用URL: https://www.google.com/accounts/o8/id

指示の通り操作を行うと、ローカルサーバーのトップ画面に戻ってきます.
途中でアカウントを作るように促されますが、これはローカルサーバーのアカウントとの紐付けを行うためのものです。
再度 http://localhost:8080/openidsample/secure/users にブラウザからアクセスします。
以下のような画面が表示されれば成功です。

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

参考URL

http://grails-plugins.github.com/grails-spring-security-openid/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>