タグ別アーカイブ: grails

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/

GrailsからSolrを呼び出すサンプル

| コメントをどうぞ

今年も残すところあと6時間ほどになりました。
今年一年を振り返ると、苦しいこと、辛いこと、、、あれ、目から熱い水がこぼれてくるぞ。
どうもこんにちわ、DiceK Mikamiです。

さて、今年最後のテーマは“Grailsを使って、Apache Solrで検索したデータを取得する”です。
 
 

Apache Solrとは

Apache Solrは、Apache Luceneをコアに持つJavaで書かれたオープンソースの検索エンジンです。国内外の大規模検索サービスで利用実績を持ちます。
国内で言えばAmebaや価格.comなどで使われているそうです。
Solrの特徴として、ファセット検索が挙げられます。
ファセット検索(ファセットナビゲーション、ファセット分析とも)とは、様々なカテゴリー(例えば、分類や期間)を前もって用意しておき、それをユーザーが選択することで検索を行うと言うものです。
また、その検索条件もヒット数などに基づいて提供されるので、“ハズレ”がありません。
「検索したはいいけど1件もヒットしなかった」などということは、このファセット検索においてはありえないのです。
Solrはこのファセット検索のインターフェースを持っています。
 

環境

  • Grails: 2.2.0-RC1
  • Java: 1.7.0_10-ea
  • Apache Solr: 4.0.0
  • solr-solrj: 4.0.0-BETA

 

サンプル

さて、RESTインターフェースを持っているのであれば、AjaxリクエストなりHTTP Clientなりで接続すれば良い訳ですが、それではあまりにも面白くない。
ということで、今回はSolrが持っているJavaクライアントsolrjを利用してみようと思います。
イメージは下図のような感じです。


 

Mavenリポジトリから取得する設定

Grailsには膨大な数のプラグインが存在します。
もちろんその中にもsolrjはあるのですが、なんとも残念なことに古いものしかありません。
ですので、BuildConfig.groovyに少し細工をしましょう。

/grails-app/conf/BuildConfig.groovy

dependencies {
    compile 'org.apache.solr:solr-solrj:4.0.0-BETA'
}

これで起動時にsolrjをMavenリポジトリからダウンロードしてくれます。
(サンプルでは4.0.0-BETAとなっていますが、適宜gradleの記法にあわせて書き換えて下さい)
 

実際に利用する

今回はコントローラーに実際のコードを入れてみます。

class SolrController {
    def index() {
        def url = 'http://localhost:8389/solr/collection1'
            
        // サーバーを作成
        SolrServer server = new HttpSolrServer(url)

        // パラメータを設定
        SolrQuery query = new SolrQuery()
        query.setParam('q','*:*')
        query.setParam('facet','true')
        query.setParam('facet.field','compName_s')
        
        //リクエスト
        QueryResponse resp = server.query(query)

        //レスポンスの処理
        ['queryResults': resp.getResults(), 'facetField': resp.getFacetFields()]
    }
}

たったこれだけでSolrから検索結果を取得できます。
また、このサンプルではHttpリクエストを利用していますが、EmbeddedSolrServerクラス(ローカルにSolrがある場合に高速にアクセスする)やLBHttpSolrServerクラス(ロードバランスを考慮して、呼び出しSolrを選択する)といった複数の呼び出し形態がありますので、Solrがどのような構成で存在するかによって適切なクラスを利用できると言うのも魅力的です。
今回はGrailsでの利用方法をサンプルとして紹介しましたが、ライブラリ自体はJavaですので、Javaアプリケーションにもすぐに取り込めるかと思います。
参考までにGitHubにサンプルコードを公開いたします。
 
 
最後になりましたが、今年一年、私の駄文にお付き合いいただきありがとうございました。
懲りずに来年も書ければいいなぁなどと寒空を眺めております。
ともあれ、皆様よいお年をお迎え下さい!!
 

参考URL

Apache Solr
Maven Repository – solrj
Solrjサンプルコード集
サンプルコード(GitHub)

Grails + Redis を利用してみる

| コメントをどうぞ

Redisが気になっていたので、RedisをGrailsから扱ってみたいと思います。
今回もまたニッチな内容をお届けしていきます。
 
 

1. 検証環境

  • Grails: 2.1.1
  • Groovy: 2.0.4
  • Java: 1.6.0_35
  • Redis: 2.4.17

 

2. Grailsアプリケーションの設定

コマンドラインからアプリの雛形を作成していきます。
また、利用するプラグインもインストールしておきます。

$ grails create-app GrailsRedisSample
$ grails install-plugin redis-gorm

Redisプラグインというものもありますが、Redis GORMよりもローレベルな階層でRedisを扱う場合にはそちらの方が良いでしょう。
今回は、GORMベースで簡単に扱いたいので、Redis GORMプラグインを利用します。

 

3. Redisとの連携を記述

Redisとの連携を設定ファイルに記述していきます。
今回利用するRedisは、HomeBrewでインストールしたものを利用します。

grails.'redis-gorm'.host="localhost"  //ホスト名
grails.'redis-gorm'.port=6379         //Redosが使用するポート番号
grails.'redis-gorm'.password=""       //デフォルトは空
grails.'redis-gorm'.pooled=true
grails.'redis-gorm'.resources=15
grails.'redis-gorm'.timeout=5000

上記、設定を「 /grails-app/conf/Config.groovy 」に記述しておくとRedisと接続します。

 

4. ドメインクラスの作成

GORMベースで扱うということなので、ドメインクラスを用意します。

$ grails create-domain-class Sample

ドメインの雛形ができたら、以下のようにします。

class Sample {
    static mapWith = "redis"

    String key;
    String value;

    static constraints = {
        key blank:false
        value blank:false
    }

    static mapping = {
        key index:true
    }
}

hibernateと併用するためには、mapWith変数にてredisを指定します。
このドメインはRedis用であることをシステムに伝えるために必要です。
あとは、普通のマッピングクラスのように作成します。
mapping変数にて、指定したものがRedisで捜索するために必要なキー値となります。
実際にRedis内では「 <パッケージ名.ドメイン名>:<キー変数名>:<値> 」という形でキーが登録されます。

 

5. コントローラクラスの作成

表示用のクラスも用意しておきます。

$ grails create-controller Sample

GORMベースに作ると何が便利かと言うと、scaffoldを使えるところです。
簡単に触るだけならばscaffoldで十分です。
作成したコントローラを以下のように変えます。

class SampleController {
    static scaffold = true
}

重要な点は、list()save()なども使えるところです。
また、サービスクラスを用意して、そこでwithTransaction()関数を設定することもできます。

 

補足

私の環境では、上記サンプルでRedisに登録した値はsetとして扱われました。
登録する内容あるいはドメイン設定によってはlistやhashなどで登録できると思います。

 

参考URL

Redis GORM – Reference Documentation
サンプルコード(GitHub)