GAE開発の落とし穴
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
ブックマークされました!
ブックマークがエラーになりました。もう一度お願いします。

作者 Fadi Shami , 翻訳者 松本 清一 投稿日 2008年3月22日
本稿では、Grailsのサンプルアプリケーションを通じてgrails-acegiプラグインの統合について説明します。この統合には、Groovy(サイト・英語)、Grails(サイト・英語)、Acegi Security(サイト・英語)の3つの主要コンポーネントを使用します。
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
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。
Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。
GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式
本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。
前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。
Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。
スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。
No comments
スレッド表示 返信