S2Flex2 related S2AnA(1.0.0-rc-7)
S2Flex2とS2AnAの連携し認証と承認機能を追加することを目的としたプロジェクトです。
ちょっと名前が長いので、いい名前を募集しています。
概要
S2Flex2 related S2AnAは S2Flex2に認証と承認機能を追加することを可能にするアドオンプロジェクトです。
S2Flex2が動作しているWebアプリケーションに、S2AnAのjarファイルと共にクラスパスに追加することで、Flexクライアントからサーバロジックを呼び出す際の認証としてS2AnAで設定されている認証情報を取得することが可能になります。
機能
- S2AnAで設定されている認証・承認機能の呼び出し
- S2Flex2-Componentsを利用してヘッダとしてユーザ情報を送信して認証・承認
その他S2AnAの機能についてはS2AnAのプロジェクトページをご参照ください。
ダウンロード
akabanaのサイトよりdownloadすることができます。
また、ソースリポジトリより最新のものをチェックアウトすることも可能です。
前提条件
S2Flex2-related-S2AnAを利用するには以下のものを必要とします。
その他S2Flex2/S2Containerを利用する上で必要なものを一緒にdeployする必要があります。
インストール
S2Flex2-related-S2AnAをインストールして使用するには次の作業をします。
- jarファイルの配置
- 認証用クラスの作成
- diconファイルの作成
jarの配置
s2flex2/S2Containerを利用する上で必要なファイルをコピーします。
- aopalliance-1.0.jar
- geronimo-jta_1.1_spec-1.0.jar
- javassist-3.4ga.jar
- log4j-1.2.13.jar
- ognl-2.6.9-patch-20070624.jar
- s2-extension-2.4.x.jar
- s2-framework-2.4.x.jar
- s2-flex2-1.1.0.jar
S2AnA連携を行うのに、追加で必要なjarファイルは以下の通りです。
- s2-ana-core-0.1.7.jar
- s2-flex2-ana-1.0.0-rc-7.jar
exampleではJDK5.0のアノテーションを利用するS2-Tigerを利用しているので以下のファイルも必要になります。
- geronimo-ejb_3.0_spec-1.0.jar
- s2-tiger-2.4.x.jar
- s2flex2-tiger-1.0.0.jar
認証用クラスの作成
認証に使用するContext(authenticationContext)としてセットするrelmを作成します。
org.seasar.flex2.rpc.remoting.security.realm.RemotingServiceRealm
を実装したクラスを用意してContextに設定するようにします。
exampleでは、HashMapを利用したrealmの実装を用意しています。
examples.security.realm.impl .HashMapRealmImpl
diconファイルの追加
S2AnAと連携する為に必要な設定を追加します。
diconファイルを追加します。
S2AnA用のdiconファイル(s2ana.dicon)
S2AnAのコンポーネントを定義します。以下はテストでも利用しているサンプル記述例です。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components namespace="s2ana">
<component
name="requireLoginOnly"
class="org.seasar.security.authorization.AuthenticatedAccessOnlyInterceptor"
/>
<component
name="requireLogin"
class="org.seasar.security.authorization.AllowInterceptor"
>
<arg>{"adminrole"}</arg>
</component>
<component
name="invalidateLogin"
class="org.seasar.flex2.rpc.remoting.security.authorization.InvalidateInterceptor"
/>
<component
name="authenticationContextResolver"
class="org.seasar.security.authentication.impl.AuthenticationContextResolverImpl">
<property name="container">container.getRoot()</property>
</component>
</components>
S2Flex2との連携で必要なdiconファイル(remoting_ana.dicon)
次にS2AnAとS2Flex2を連携する上で必要なコンポーネントの設定を行います。上記のs2ana.diconをincludeし、Contextに認証に利用するrealmを指定します。下記にHashMapを利用した認証を行うrealmを指定した例を示します。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
"http://www.seasar.org/dtd/components23.dtd">
<components namespace="remoting_ana">
<include path="remoting_amf3.dicon"/>
<!--
Authentication
-->
<component
class="org.seasar.flex2.rpc.remoting.security.impl.RemotingServicePrincipalImpl"
instance="prototype"
/>
<component
class="org.seasar.flex2.rpc.remoting.security.factory.impl.RemotingServicePrincipalFactoryImpl"
/> <!--
Realm
-->
<component
class="examples.security.realm.impl.HashMapRealmImpl"
>
<property name="userMap">
<component class="java.util.HashMap" >
<initMethod name="put">
<arg>"admin"</arg>
<arg>"adminpass"</arg>
</initMethod>
</component>
</property>
<property name="userRoleMap">
<component class="java.util.HashMap" >
<initMethod name="put">
<arg>"admin"</arg>
<arg>"adminrole"</arg>
</initMethod>
</component>
</property>
</component> <!--
Authentication Context
-->
<component
name="authenticationContext"
class="org.seasar.flex2.rpc.remoting.security.authentication.impl.RemotingServiceAuthenticationContextImpl">
<property name="storage">
<component
class="org.seasar.flex2.rpc.remoting.security.impl.RemotingServicePrincipalSessionStorageImpl"
/>
</property>
</component>
</components>
上記の設定を追加した記述例をresources以下にサンプルとして用意しています。 (remoting_ana.dicon/s2ana.dicon)
customizerを利用してアスペクトを定義する
コンポーネント登録後は、S2AnAを利用した認証を利用するサービスについて、Interceptorを定義します。以下はその記述例です。
<component name="serviceAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer"> <property name="interceptorName">"s2ana.requireLogin"</property> </component>
<component name="remotingServiceCustomizer" class="org.seasar.flex2.rpc.remoting.service.customizer.RemotingServiceCustomizer"> </component>
exampleでは、上記の設定を追加したファイル(flex2_example-customizer.dicon)を同梱して、すべてのサービスにS2AnAのInterceptorを設定するようにしています。
flex2クライアントからの認証情報を渡す
flex2クライアントから認証情報をわたすには、S2Flex2Service#setCredencialを利用してサーバにユーザ情報を渡します。
例)
var paramcheckService:S2Flex2Service = new S2Flex2Service("paramCheckService");
paramCheckService.initilized(this,"paramCheckservice");
paramCheckService.setCredencial("user","pass");
paramCheckService.getTypeCDto(3,typeA,typeB);