2008-04-27

BlazeDSとセッション変数、Springのsessionスコープ その1

一般的に、RIAではその設計上サーバサイドでユーザの状態を持つ必要がほとんどない。例えば、Flexなら、ショッピングカートを実装するためにわざわざサーバ側でセッション変数を使わなくとも、Flexアプリケーションの内部変数、つまり ActionScriptの変数でカートの中身を保持すれば良い。

しかしながら、RIAであってもセッション変数を使ってサーバ側で保持せざるを得ないデータがひとつだけある。それは認証に関するものだ。認証はユーザがアプリケーションを起動した際に一度だけ行われ、それ以降はIDやパスワードのやりとりをせずとも済むのが好ましい。そのためには、認証情報をリモートオブジェクトのコンテナたるサーバ側でセッションに関連づけて保持する必要がある。

もし認証情報をサーバ側で保持しないとなれば、ユーザの特定や正当性検証を行うためリモートオブジェクトのあらゆるメソッドに引数としてID/パスワードが必要となってしまうことになり大変不経済であるのは想像に難くないだろう。

ここでは、BlazeDSを使って Flex向けのサービスを構築する際にセッション変数の扱いをどのように行うことが出来るかをまず説明する。

BlazeDS経由で呼び出されるリモートメソッドの中では、FlexContextクラスのstaticメソッド getHttpRequest() で HttpServletRequestのインスタンスを得ることが出来る。ここからさらに getSession()をコールすることによりセッションオブジェクトへアクセス出来るため、通常のサーブレットプログラミングと同様のやり方でセッション変数を保持したり読み出したりすることが可能だ。

HttpSession session = FlexContext.getHttpRequest().getSession();
session.setAttribute("mysessionobject", value);

クライアント)
ID/パスワードを引数とし、サーバ側の認証メソッドをコールする

サーバ)
ID/パスワードの検証を行い、正当であればセッション変数にユーザIDを保持しtrueを返す

クライアント)
認証メソッドがtrueを返してきたら、ステートを切り替えてユーザの操作を可能にする。

クライアントはサーバ側の様々なメソッドを必要に応じて呼び出す
サーバは「セッション変数にユーザIDが入っているか確認し、もし未認証状態であれば例外をスローする(この場合、Flex側ではFaultイベントが発生することになる)」という処理をあらゆるメソッドの先頭で行う。

この方法で、認証処理をアプリケーション起動時の1回だけに抑えつつも、認証を通過していないセッションからの不正なメソッド呼び出しを防ぐことが出来る。・・・・ひとまずは。

しかし、この方法はいくつかの問題を抱えている。
続く。

ラベル: ,

0 件のコメント:

コメントを投稿

<< ホーム