2011年5月28日土曜日

アプリケーションへのアクセスを制限する (Google App Engine)

URLパターンでアクセスを制限する

特定のURLパターンに対してアクセスを制限するには web.xml のsecurity-constraint要素で定義できる。

web-app要素(ルートの要素)の下にsecurity-constraint要素を追加する。

<security-constraint>

    <web-resource-collection>
        <web-resource-name>admin tool</web-resource-name>
        <url-pattern>/admin-tool*</url-pattern>
    </web-resource-collection>

    <user-data-constraint>
        <role-name>admin</role-name>
    </user-data-constraint>

</security-constraint>

アクセス可能なロールをadminとしておくと、AppEngineアプリの設定画面で管理者として設定したGoogleアカウントでしかアクセスできなくなる。Googleにログインせずに該当のURLにアクセスした場合は自動的にGoogleアカウントへのログイン画面へリダイレクトされる。

プログラムで動的にアクセスを制限する

開発環境とGAEのサーバー環境でアクセス制限方法を変えたり、非公開バージョンだけにアクセス制限をかけたい場合など、security constraint では柔軟性に欠ける場合にはアプリ自前のコードでアクセス制限をかけることができる。ただし、静的ファイルにはこの方法は使えない。

ここで言う”管理者”もsecurity-constraintの場合と同じ、アプリの設定画面で設定したGoogleアカウントのことを指す。

次のAPIはアクセス制限の役に立つ。

SystemProperty.applicationId
リクエストされたホスト名がアプリのホスト名かどうか判断するときに使う。

SystemProperty.environment
アプリが稼動する環境が開発環境かGAEサーバー環境かを判断するときに使う。

UserService#isUserAdmin()
Googleアカウントにログイン中のユーザーがアプリの管理者かどうかを判断するときに使う。

HttpServletRequest#getUserPrincipal()
ユーザーがログインしているかを判断するときに使う。

コード例

UserService userService = UserserviceFactory.getUserService();
if ( request.getUserPrincipal() != null
  && userService.isUserAdmin() ) {
    // アクセス許可
}
else {
    // アクセス拒否
}