BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ アーティクル Acegi SecurityでセキュアなGrailsアプリケーションを作る

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

目次

始めに
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

この記事に星をつける

おすすめ度
スタイル

BT