InfoQ

Articles

Acegi SecurityでセキュアなGrailsアプリケーションを作る

作者 Fadi Shami, 翻訳者 松本 清一 投稿日 2008年3月22日 午後8時58分

コミュニティ
Java
トピック
セキュリティ
タグ
Grails,
Groovy

目次

始めに
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を試すために全てのチュートリアルを完成させる必要はありません。必要なもの全てはドメインクラスとコントローラーで、コントローラーのスカッフォールディングを試すのには十分と言えます。

Figure 1 - Directory structure after creating the racetrack application

図1 - racetrackアプリケーション作成後のディレクトリ構造

RaceTrackアプリケーションのディレクトリは、図1のようになります。そこで、\grails-app\domain フォルダを開きます。

Figure 2 - domain classes directory

図2 - ドメインクラスのディレクトリ

図2では、domainディレクトリにRaceとRegistrationの2つのドメインクラスがあるのが分かります。そこで、\grails-app \controllersフォルダーを開き、図3にあるようにそれぞれのドメインクラスに対してコントローラークラスがあることを確認してください。

Figure 3 - Controllers directory

図3 - Controllersディレクトリ

これらのコントローラーは空なので、以下のようにして、コントローラーのスカッフォールディングを行います。

  class RaceController { def scaffold = Race }

class RegistrationController { def scaffold = Registration }

これでアプリケーションを起動し実行する準備が整いました。RaceTrackアプリケーションを起動した後で、下図4のように作成した2つのコントローラがコントローラーのリストに表示されていることを確認することができます。

Figure 4 - Index page before Grails-Acegi Plugin

図4 - Grails-Acegiプラグイン導入前のインデックスページ

Grails Acegiプラグインのインストール

次に、RaceTrackでgrails-acegiプラグインが提供するロールベースのセキュリティを活用するために、プラグインのインストールを行います。コマンドプロンプトでracetrackディレクトリに移動し、以下のコマンドを実行してください。

grails install-plugin [path-to]/grails-acegi-0.2.zip 

このコマンドで、下図5にあるようにracetrackディレクトリ下にpluginsディレクトリが作成されます。

Figure 5 - plugins directory created after installing the plugin

図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メールの警告設定をどうするのか(警告あり/なし)といったことを含みます。

Figure 6 - AuthUser.groovy, Role.groovy and Requestmap.groovy (used in AcegiConfig)

図6 - AuthUser.groovy、Role.groovy、Requestmap.groovy(AcegiConfig使用)

Figure 7 - AcegiConfig.groovy created

図7 - 作成されたAcegiConfig.groovy

AuthUsersを作成したので、新規にRolesを作成しAuthUsersに割り当てます。以下の2つのコマンドが必要になります。初めのコマンドでドメインのCRUDコントロールを生成します。

grails generate-manager

次に、コントローラーとドメインにregistrationを生成します。

grails generate-registration

これらのコマンドで、ユーザーの登録、ユーザー名とパスワードの作成、作成したユーザーに対するデフォルトセキュリティロールの割り当てができるようになります。生成されたコントローラーのセットは、下図8のようになっています。

Figure 8 - CRUD controllers (Login and Logout controllers are created when the Auth and Role domains are created)

図8 - CRUDコントローラー(AuthとRoleドメインが作られると、LoginとLogoutコントローラーが作られます)

Figure 9 - Controllers available after grails-acegi-plugin installation

図9 - grails-acegiプラグインをインストールすると、コントローラーが使用できるようになります

RaceTrackのホームページに戻ると、図9のようになっているはずです。

アプリケーションをセキュアにするためのAcegi Securityの設定

ここでは、userロールmanagerロールを作成します。これを行うために、RoleControllerを起動し、Role Nameに"user"、role descriptionに適当な記述を入力します(図10)。RoleControllerは"user"を"ROLE_USER"に変換し、データベースやAcegiの設定で呼び出されることに注意してください。managerロールも同様にして作成します。

Figure 10 - Creating a user role

図10 - ユーザーロールを作成する

ホームページに戻り、UserControllerをクリックしてください。ここで、"user"ロールを付与したユーザーと"manager"ロールを付与したユーザーを作成します。下図11のようになります。

Figure 11 - Create a standard user, enable the account and assign the 'user' role

図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/**).

Figure 12 - Manager access rules

図12 - Managerのアクセスルール

なお、managerロールにすべてのユーザー権限を付与するというのは良い訓練となります。次に、userロールのためのアクセスルールを作成します。 URLフィールドに"/race/list/**"、Roleフィールドに"user, manager"を入力します(図13 - ロールはカンマで区切る点に注意してください)。これにより、userとmanagerの両方がraceリストページにアクセス可能なアクセスルールを作成します。両方のロールを指定する必要がある点に注意してください。つまり、userロールに対してのみこのURLを割り当てたいのなら、manager に対して前のルールで上書き、userロールだけがそのページにアクセスできるようにしてください。先に定められたルールの残りの作業として前のステップを繰り返してください。これにより、raceとregistrationページに対するアクセスルールのすべてをつくります。

Figure 13 - Creating rule for /race/list/** page - give access to users and managers

図13 - /race/list/**ページに対するルールの作成。usersとmanagersにアクセス権限を与えます。

テスト

RaceTrack ホームページから、RaceControllerかRegistrationControllerのどちらか一方をクリックします(ビューに対するコントローラーはセキュアになっています)。そこで注意すべき点は、ログインページに自動的にリダイレクトされることです。もし、初めにmanagerロールを持つユーザーでログインする場合は、raceとregistrationページの全てにおいて、参照・登録・更新・削除が可能であることに注意してください。

Figure 14 - Logging in as a user

図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)

Figure 15 - Race List view

図15 - Raceリストビュー

Figure 16 - Access denied error page

図16 - アクセスが拒否されエラーページが表示される

おめでとうございます。たった今、あなたは十分にセキュアなRaceTrackアプリケーションを手にしました。

原文はこちらです:http://www.infoq.com/articles/grails-acegi-integration

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
Hatena

No comments

返信

ジャンル別一覧

.NET Webサービス向けのサービスレジストリの実装

本稿では、SOAソリューションの実装を単純化するために利用できるサービスレジストリの.NET実装を説明します。

John Lamが語るIronRubyの現状

InfoQは、独創的なRubyCLRの開発者であり、IronRubyを世に出すためにマイクロソフトが雇い入れたJohn Lam氏と話す機会を得た。Johnの正式な肩書きはDynamic Language Runtimeチームのプログラムマネジャーである。

人に愛されるリモートミーティングの手引き

テレカンファレンスとデスクトップを共有するツールを使いこなすことは、現在のビジネスにおいて重要なスキルになっています。本稿は、これらの情報と裏技を提供します。

Lean開発者のスタート: チームのスタートアップ時間の削減

アジャイルプラクティスは新チームメーンバーが知りたい情報を直接提供するものではありません。そこで私は、新しいチームメンバーの「セットアップ時間」の削減するために、新しいプラクティスを提案します。

複数のアジャイルチームでのバージョン管理

このレポートでは複数のチームが動いているアジャイル環境において、どのようにバージョン管理を行えばいいかを説明します。このスキームは"Scrum and XP from the Trenches(InfoQのミニブック)に出てきた企業で私たちが新しく採用した方法です。

ErlangとYawsを使ったRESTfulサービス

本稿では、Steve Vinoski氏が、プログラミング言語ErlangとWebサーバーYawsを使用したRESTful Webサービスを構築する方法を説明します。

Google Gearsの現状、そして未来を占う

この記事では、現在Gearsが提供している機能を学び直すとともに、Gearsが将来備える可能性のある機能を紹介することで、Gearsが目指すものを明らかにしていきたいと思います。そして最後に筆者の私見も交えつつ、Web技術の将来像について少し想像を巡らせたいと思います。

高い生産性を生み出すソフトウェア開発の秘伝

何について学ぶのか?お互いのこと、テクノロジ、ドメイン、顧客など、すべてについてである。速く学習するチームは成功する。チームのパフォーマンスを妨げる目に見えない「学習ボトルネック」について詳しく知りたいのなら続けて読んでほしい。