Google App Engine for Java
Java言語で開発するGAEアプリについてのメモ
Google App Engine for Java (GAE/J) アプリケーションは、サーブレットエンジン上で動くWebアプリケーションであり、標準仕様であるサーブレットAPIとJSPを使って開発する。BigTableには、JDOまたはJPAのAPIを使ってアクセスする。ただし全て標準のAPIのみで開発するのは難しく、ほとんど全てのケースにおいて、GAE/J独自のクラスを使用することになるだろう。
フレームワーク
GAEの制限のため既存のJavaEEフレームワークを動作させるのは難しい。現在、SeasarプロジェクトでSlim3というGAEに最適化されたフレームワークが開発されている。
サーブレットとJSP
Servlet 2.5、JSP 2.1仕様のAPIが利用できる。
デフォルトではHttpSessionオブジェクトが使えないようになっている。HttpSessionを有効にするにはWEB-INF/appengine-web.xmlファイルの以下の項目をtrueに設定する。
<sessions-enabled>true</sessions-enabled>
いくつかのJSTLのタグはセッションを使うので、有効にしないとエラーになる場合がある。セッションはMemcacheまたはBigTableに保存されるらしく、パフォーマンスやスケーラビリティを気にする事なく使えそうだが、デフォルトオフということは何かペナルティがあるのかもしれない…。
ユーザ
Googleアカウントをユーザ認証に使う事ができる。またはGoogle Appsアカウントも使用できる。両方同時に使う事はできない。また不特定のGoogle Appsアカウントを使う事もできず、現在のところ1アプリで1つのGoogle Appsドメインのみ利用可能。
認証すれば、HttpServletRequest#getUserPrincipalや HttpServletRequest#getRemoteUserなどのサーブレットAPIを利用できるが、普通は以下のようにしてGoogleアカウントのユーザデータを取得する。
UserService userService = UserServiceFactory.getUserService(); User uesr = userService.getCurrentUser();
このUserオブジェクトはJDOを通してBigTableに保存可能である。ユーザ毎にデータを保存したければエンティティにUserのフィールドを追加すればいい。
ログイン判定
userがnullかどうかで判定すればいい。
UserService userService = UserServiceFactory.getUserService(); User user = userService.getCurrentUser(); if (user == null) { res.sendRedirect(userService.createLoginURL(req.getRequestURI())); }
なお、UserService#isUserLoggedInメソッドは、一人以上のユーザが現在ログイン状態であるかチェックするメソッドで、このユーザがログイン状態であるか調べるメソッドではない。テスト環境ではこのメソッドでチェックしても問題ないように見えるので要注意。
特定のURLを認証するには、普通にweb.xmlに記述すれば良い。
<security-constraint> <web-resource-collection> <web-resource-name>Staff Only</web-resource-name> <url-pattern>/note/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>*</role-name> </auth-constraint> </security-constraint>
role-nameは*またはadminを指定できる。
管理ユーザ
管理ユーザの判定
if (UserServiceFactory.getUserService().isAdminUser()) { System.out.println("管理ユーザです"); }
管理ユーザでログインすると admin というロール名が設定される? web.xmlやHttpServletRequest#isUserInRole等でadminを調べれば良いらしい?