サーバ側の destination にセキュリティをかけられるという話。
J2EE のセキュリティフレームワークや、カスタムのセキュリティ用ロジックを使えるらしい。
Securing BlazeDS
- Authentication はユーザーの認証。
- Authorization は行動に対する許可。
- Authentication を通過しなければ Authorization はできない。
- BlazeDS では destination に対してセキュリティ制約をかけることができる。
- Basic認証では、credentialが無かったり間違っていたりする場合に HTTP 401 を返すことにより、ブラウザ側でログインダイアログを出す。カスタム認証ではクライアントに失敗を返す。デフォルトはカスタム認証。
- BlazeDS では login Command により認証を行う。これはサーバ実装により異なる。Tomcat, JBoss, Oracle Application Server, BEA WebLogic, IBM WebSphere, Adobe JRun 用のものは事前に用意されている。
- login command は role を使わない authentication のみも可能。
- login command は flex.messaging.security.LoginCommand インタフェースを実装している。これを実装したカスタムの login command を作成することも可能。
- channel と endpoint のレベルで https を用いて通信をセキュアにすることも可能。
- ベーシックとカスタム認証でセキュリティ制約を作成するステップはほとんど同様。異なるのはクライアントからサーバにどのようにクレデンシャルを渡すか。セキュリティを設定するステップは以下:
- 1.services-config.xml ファイル内の security 要素により login command を指定する。
- 2.services-config.xml ファイル内にセキュリティ制約を定義する。セキュリティ制約はベーシック認証もしくはカスタム認証を設定できる。ひとつか複数のロールの設定もできる。
- 3.destination 定義からセキュリティ制約を参照させる。
- 4.カスタム認証を利用する場合、ChannelSet.login() メソッドにてサーバからクレデンシャルを渡す。result event は成功を示し、fault event は失敗を示す。ベーシック認証の場合は、flex アプリケーションでは何もしなくてもOK。ブラウザが勝手に認証ダイアログで対応してくれる。
Configuring security
- セキュリティ設定は services-config.xml に書いてもいいけど、data-management-config.xml や messaging-config.xml やその他の設定ファイルに書いてもよい。
- セキュリティ制約は destination の定義時に参照される。
- 複数の destination が同一のセキュリティ制約を参照してもかまわない。
- デフォルトではセッション毎に認証され、情報は session に格納される。
- per-client-authentication プロパティによりクライアント毎に認証をかけることも可能。この場合、データは FlexClient に格納される。
- per-client-authentication を true にした場合、ブラウザの状態により認証がリセットされるので、ブラウザのリフレッシュで認証がリフレッシュすることもある。
- BlazeDS がデフォルトで用意する login command は session に依存しているので、per-client-authentication を true にする場合はカスタムの login command を作成し、session が競合しても問題ないようにする必要がある。
- 単一の destination のみで利用されるセキュリティ制約は、destination 定義中に記述することが可能。
- service レベルでデフォルトのセキュリティ制約をかけることもできる。service/default-security-constraint@ref 属性に security-constraint の id を指定すればOK。→ これ便利。
- RemoteService の destination の場合、include-methods と exclude-methods にてメソッドレベルの設定が可能。許可されていないメソッドが呼び出された場合は fault イベントが発生する。
Custom authentication
- カスタム認証の場合、クライアントアプリケーション側で明示的に ChannelSet.login() や ChannelSet.logout() を呼び出す。login にはユーザ名とパスワードが必要。
- RemoteObject等のインスタンスに setCredentials() を使うと、呼び出し時に自動的にクレデンシャルをつかってくれるらしい。
- useProxy プロパティを true にしておかないと、login(), setCredentials(), setRemoteCredentials() メソッドが機能しないらしい。
- per-client-authentication property が false の場合、logout()メソッドは session を invalidate する。
- per-client-authentication property が true の場合、logout()メソッドは FlexClient オブジェクトの認証情報をクリアするが、FlexClient や session は破棄しない。
Passing credentials to a proxy service
プロキシした先でクレデンシャルが必要な場合のお話。
0 件のコメント:
コメントを投稿