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

作者 Fadi Shami, 翻訳者 松本 清一 投稿日 2008年3月22日 午後8時58分
本稿では、Grailsのサンプルアプリケーションを通じてgrails-acegiプラグインの統合について説明します。この統合には、Groovy(サイト・英語)、Grails(サイト・英語)、Acegi Security(サイト・英語)の3つの主要コンポーネントを使用します。
富士フイルム&F2M&NRI&トランスコスモス 主催 次世代ネットビジネスを勝ち抜くマーケティング戦略セミナー(5/23:東京)
Groovy は、JavaのバイトコードにコンパイルするJavaプラットホームのための強力でハイレベルな言語です。それは、RubyやPythonのコンセプトに似ていますが、Javaプラットフォームと密に統合されています。これにより、強力で簡単なコードシンタックスを利用することができます。さらには、 JVM上で動作するため、既存のJavaプラットフォームや周辺ライブラリを有効活用することができます。.
Grails は、Groovyで実装されたフルスタックフレームワークです。Grailsは、Web開発の難題の多くをGrailsのコア技術と関連するプラグインによって解決しようとします。そこには、以下にあげる革新的な機能が含まれています。
Acegi Security は、エンタープライズソフトウェアにおける強力で柔軟なセキュリティソリューションで、特に、Springを利用したアプリケーションに重点を置いています。Acegiは、認証、認可、インスタンスベースのアクセス制御、通信セキュリティ、ユーザー検出機能と、広範囲にサポートしています。
本稿では、Jason Rudolph(source)によるGetting Started with Grails(source) にあるGrailsのチュートリアルを完了し、RaceTrackサンプルアプリケーションが実装済みであることを前提としています。そして、あなたのアプリケーションにセキュリティ機能を追加するために、grails-acegiプラグインを組み込むことになります。grails-acegiプラグインを利用することで、アプリケーションにGrailsのインターセプターを実装する際のオーバーヘッドを無くし、インターセプターよりもより柔軟になります。さらには、Acegiの利用によりセキュリティシステムの再実装を節減します。
まず初めに、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プラグイン導入前のインデックスページ
次に、RaceTrackでgrails-acegiプラグインが提供するロールベースのセキュリティを活用するために、プラグインのインストールを行います。コマンドプロンプトでracetrackディレクトリに移動し、以下のコマンドを実行してください。
grails install-plugin [path-to]/grails-acegi-0.2.zip
このコマンドで、下図5にあるようにracetrackディレクトリ下にpluginsディレクトリが作成されます。
図5 - プラグインインストール後に作成されたpluginsディレクトリ
次のステップでは、ユーザーアカウントとロールを表すドメインクラスを作成します。初めに、以下のコマンドを実行してください。
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のようになっているはずです。
ここでは、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
InfoQは、独創的なRubyCLRの開発者であり、IronRubyを世に出すためにマイクロソフトが雇い入れたJohn Lam氏と話す機会を得た。Johnの正式な肩書きはDynamic Language Runtimeチームのプログラムマネジャーである。
テレカンファレンスとデスクトップを共有するツールを使いこなすことは、現在のビジネスにおいて重要なスキルになっています。本稿は、これらの情報と裏技を提供します。
アジャイルプラクティスは新チームメーンバーが知りたい情報を直接提供するものではありません。そこで私は、新しいチームメンバーの「セットアップ時間」の削減するために、新しいプラクティスを提案します。
このレポートでは複数のチームが動いているアジャイル環境において、どのようにバージョン管理を行えばいいかを説明します。このスキームは"Scrum and XP from the Trenches(InfoQのミニブック)に出てきた企業で私たちが新しく採用した方法です。
本稿では、Steve Vinoski氏が、プログラミング言語ErlangとWebサーバーYawsを使用したRESTful Webサービスを構築する方法を説明します。
この記事では、現在Gearsが提供している機能を学び直すとともに、Gearsが将来備える可能性のある機能を紹介することで、Gearsが目指すものを明らかにしていきたいと思います。そして最後に筆者の私見も交えつつ、Web技術の将来像について少し想像を巡らせたいと思います。
何について学ぶのか?お互いのこと、テクノロジ、ドメイン、顧客など、すべてについてである。速く学習するチームは成功する。チームのパフォーマンスを妨げる目に見えない「学習ボトルネック」について詳しく知りたいのなら続けて読んでほしい。
No comments
返信