目次
始めにRaceTrackサンプルアプリケーションのセットアップ
Grails Acegiプラグインのインストール
Acegi Securityコンポーネントの作成
アプリケーションをセキュアにするためのAcegi Securityの設定
テスト
始めに
本稿では、Grailsのサンプルアプリケーションを通じてgrails-acegiプラグインの統合について説明します。この統合には、Groovy(サイト・英語)、Grails(サイト・英語)、Acegi Security(サイト・英語)の3つの主要コンポーネントを使用します。
Groovy は、JavaのバイトコードにコンパイルするJavaプラットホームのための強力でハイレベルな言語です。それは、RubyやPythonのコンセプトに似ていますが、Javaプラットフォームと密に統合されています。これにより、強力で簡単なコードシンタックスを利用することができます。さらには、 JVM上で動作するため、既存のJavaプラットフォームや周辺ライブラリを有効活用することができます。.
Grails は、Groovyで実装されたフルスタックフレームワークです。Grailsは、Web開発の難題の多くをGrailsのコア技術と関連するプラグインによって解決しようとします。そこには、以下にあげる革新的な機能が含まれています。
- Hibernate(サイト・英語)によるオブジェクトリレーショナルマッピング(ORM)
- Groovy Server Pages (GSP)と呼ばれる表現豊かなビュー技術
- Spring(サイト・英語) MVCによるコントローラー層
- AntのGroovy版であるGant(サイト・英語)によるコマンドラインのスクリプト環境
- オンザフライでリソースのリロードをするための組み込みJettyコンテナ
- 組み込みのSpringコンテナによるDI
- SpringのメッセージソースAPIによる国際化(i18n)のサポート
- Springのトランザクション管理を利用したトランザクションサービス層
- ドメイン特化言語(DSL)の拡張利用
Acegi Security は、エンタープライズソフトウェアにおける強力で柔軟なセキュリティソリューションで、特に、Springを利用したアプリケーションに重点を置いています。Acegiは、認証、認可、インスタンスベースのアクセス制御、通信セキュリティ、ユーザー検出機能と、広範囲にサポートしています。
本稿では、Jason Rudolph(source)によるGetting Started with Grails(source) にあるGrailsのチュートリアルを完了し、RaceTrackサンプルアプリケーションが実装済みであることを前提としています。そして、あなたのアプリケーションにセキュリティ機能を追加するために、grails-acegiプラグインを組み込むことになります。grails-acegiプラグインを利用することで、アプリケーションにGrailsのインターセプターを実装する際のオーバーヘッドを無くし、インターセプターよりもより柔軟になります。さらには、Acegiの利用によりセキュリティシステムの再実装を節減します。
RaceTrackサンプルアプリケーションのセットアップ
まず初めに、Grails 1.0(source)、grails-acegi-0.2プラグイン(source)、Java SE JDK 5.0(source)以降のバージョンをダウンロードしてください。
ここでは、Getting Started with Grails(source)に記載されているRaceTrackアプリケーションの大部分が実装済みであることを前提としています。しかし、grails-acegiを試すために全てのチュートリアルを完成させる必要はありません。必要なもの全てはドメインクラスとコントローラーで、コントローラーのスカッフォールディングを試すのには十分と言えます。
図1 - racetrackアプリケーション作成後のディレクトリ構造
RaceTrackアプリケーションのディレクトリは、図1のようになります。そこで、\grails-app\domain フォルダを開きます。
図2 - ドメインクラスのディレクトリ
図2では、domainディレクトリにRaceとRegistrationの2つのドメインクラスがあるのが分かります。そこで、\grails-app \controllersフォルダーを開き、図3にあるようにそれぞれのドメインクラスに対してコントローラークラスがあることを確認してください。
図3 - Controllersディレクトリ
これらのコントローラーは空なので、以下のようにして、コントローラーのスカッフォールディングを行います。
class RaceController { def scaffold = Race }
class RegistrationController { def scaffold = Registration }
これでアプリケーションを起動し実行する準備が整いました。RaceTrackアプリケーションを起動した後で、下図4のように作成した2つのコントローラがコントローラーのリストに表示されていることを確認することができます。
図4 - Grails-Acegiプラグイン導入前のインデックスページ
Grails Acegiプラグインのインストール
次に、RaceTrackでgrails-acegiプラグインが提供するロールベースのセキュリティを活用するために、プラグインのインストールを行います。コマンドプロンプトでracetrackディレクトリに移動し、以下のコマンドを実行してください。
grails install-plugin [path-to]/grails-acegi-0.2.zip
このコマンドで、下図5にあるようにracetrackディレクトリ下にpluginsディレクトリが作成されます。
図5 - プラグインインストール後に作成されたpluginsディレクトリ
Acegi Securityコンポーネントの作成
次のステップでは、ユーザーアカウントとロールを表すドメインクラスを作成します。初めに、以下のコマンドを実行してください。
grails create-auth-domains AuthUser Role
ここでは、2つのドメインクラス(AuthUserとRole)の作成、AcegiConfigクラスの設定、ログイン・ログアウトクラスの作成を行います。AuthUserドメインクラスはユーザーを表現するクラスで、新しいユーザー毎にAuth_Userテーブルに新規レコードを作成します。Role ドメインクラスはセキュリティロールを表現するクラスで、全てのユーザーが保持することを許されているものです。つまり、RoleがAuthUserに割り当てられます。これらのクラスは、図6で示されています。
AcegiConfigクラス(図7)は、アプリケーションのセキュリティ構成を定義します。それは、ユーザードメインクラスの名称(この場合は AuthUser)とロールドメインクラス(この場合はRole)、動的/静的なセキュアなURLを利用するのかどうか、Eメールの警告設定をどうするのか(警告あり/なし)といったことを含みます。
図6 - AuthUser.groovy、Role.groovy、Requestmap.groovy(AcegiConfig使用)
図7 - 作成されたAcegiConfig.groovy
AuthUsersを作成したので、新規にRolesを作成しAuthUsersに割り当てます。以下の2つのコマンドが必要になります。初めのコマンドでドメインのCRUDコントロールを生成します。
grails generate-manager
次に、コントローラーとドメインにregistrationを生成します。
grails generate-registration
これらのコマンドで、ユーザーの登録、ユーザー名とパスワードの作成、作成したユーザーに対するデフォルトセキュリティロールの割り当てができるようになります。生成されたコントローラーのセットは、下図8のようになっています。
図8 - CRUDコントローラー(AuthとRoleドメインが作られると、LoginとLogoutコントローラーが作られます)
図9 - grails-acegiプラグインをインストールすると、コントローラーが使用できるようになります
RaceTrackのホームページに戻ると、図9のようになっているはずです。
アプリケーションをセキュアにするためのAcegi Securityの設定
ここでは、userロールmanagerロールを作成します。これを行うために、RoleControllerを起動し、Role Nameに"user"、role descriptionに適当な記述を入力します(図10)。RoleControllerは"user"を"ROLE_USER"に変換し、データベースやAcegiの設定で呼び出されることに注意してください。managerロールも同様にして作成します。
図10 - ユーザーロールを作成する
ホームページに戻り、UserControllerをクリックしてください。ここで、"user"ロールを付与したユーザーと"manager"ロールを付与したユーザーを作成します。下図11のようになります。
図11 - 標準ユーザーの作成。アカウントを有効にし、"user"ロールを割り当てます。
ロールとユーザーがきちんと設定できたので、次のステップではセキュアなRaceTrackアプリケーションを作成します。URLをセキュアにするためには2 つの方法があります。ひとつはRequestmapControllerによる動的なもので、もう一つはAcegiConfig.groovyファイルを直接編集する方法があります。ここでは、動的設定が推奨される選択なので、そちらを説明したいと思います。
アプリケーションをセキュアにする前に、私たちはアプリケーションで表現されるべきアクセスルールについて考える必要があります。managerがアプリケーション全てのページに対してread/writeアクセス権限が許容されているときは、以下のようになります。
/race/*
/registration/*
userは、いくつかのページでread権限のみが許容されている場合は、以下のようになります。
/race/list/*
/race/show/*
/registration/list/*
/registration/show/*
ここで、これらのルールは、RequestmapControllerを使用したAcegi request mapのエントリーに変換する必要があります。RaceTrackのホームページから、RequestmapControllerをクリックし、 "create a new requestmap"のページに進んでください。URLフィールドで"/race/**"と入力し、Roleフィールドで"manager"と入力します(図12)。これにより、managerロールを持つ全てのユーザーが/race以下の全てのURLにアクセスできるようにするルールを作成しています。registrationに対しても同様のことを行ってください。(URL: /registration/**).
図12 - Managerのアクセスルール
なお、managerロールにすべてのユーザー権限を付与するというのは良い訓練となります。次に、userロールのためのアクセスルールを作成します。 URLフィールドに"/race/list/**"、Roleフィールドに"user, manager"を入力します(図13 - ロールはカンマで区切る点に注意してください)。これにより、userとmanagerの両方がraceリストページにアクセス可能なアクセスルールを作成します。両方のロールを指定する必要がある点に注意してください。つまり、userロールに対してのみこのURLを割り当てたいのなら、manager に対して前のルールで上書き、userロールだけがそのページにアクセスできるようにしてください。先に定められたルールの残りの作業として前のステップを繰り返してください。これにより、raceとregistrationページに対するアクセスルールのすべてをつくります。
図13 - /race/list/**ページに対するルールの作成。usersとmanagersにアクセス権限を与えます。
テスト
RaceTrack ホームページから、RaceControllerかRegistrationControllerのどちらか一方をクリックします(ビューに対するコントローラーはセキュアになっています)。そこで注意すべき点は、ログインページに自動的にリダイレクトされることです。もし、初めにmanagerロールを持つユーザーでログインする場合は、raceとregistrationページの全てにおいて、参照・登録・更新・削除が可能であることに注意してください。
図14 - userでログイン
RaceTrack ホームページに戻り、LogoutControllerをクリックします。これにより、ユーザーセッションを無効としログアウトします。再度 LoginControllerをクリックし、今回はuserロールを持つユーザーとしてログインします。もし、/race/listサブページに移動したら(http://localhost:8080/racetrack/race/listに直接移動するか、controllerのインターフェースから移動するかのどちらか)、race/listビューが参照できるようになるでしょう。
アクセスルールでは、managerのみが新規レコードの作成が許容されていて、userはListとShowを通じたデータの参照のみが可能となっている点を覚えていてください。これは、もしuserロールを持つユーザーで新規Race(http://localhost:8080/racetrack/race/create)へのクリックをしようとしたときには、Acegiはそのページへの移動を拒否し、新規レコードの作成ができません。
どのように動きましたか?managerに/race/*へのアクセスを与えたけれども、userには/race/list/*と/race/show/* へのアクセスしか与えていないことを思い出してください。"user"ロールを持つユーザーが/race/createページにアクセスしようとすると、 Acegiがそのユーザーに対するロールセットを見て、"user"ロールのみを持っていることを確認します。Request mapでは、このページへのアクセスが許可されるには、"manager"ロールを持つ必要があるということが示されているので、ページへのアクセスが拒否されます。
ちなみに、本当のアプリケーションでは、おそらく、デフォルトより良いエラーページを表示したいでしょう。(図16)
図15 - Raceリストビュー
図16 - アクセスが拒否されエラーページが表示される
おめでとうございます。たった今、あなたは十分にセキュアなRaceTrackアプリケーションを手にしました。
原文はこちらです:http://www.infoq.com/articles/grails-acegi-integration