JSR 286 Portlet Specification 2.0 (PLT.11.1.1.14 – PLT.11.1.2)

1週間ぶりに続きから・・・

PLT.11.1.1.4 Public Render Parameters

他のポートレットとレンダーパラメータを協調できるようにするため、ポートレットはportlet.xmlにpublic-render-parameter要素を宣言できる。ここでいうポートレット間の共有とは、ポートレットアプリケーションを越える共有もできるみたい。Public Render Parameter(公開描画パラメータ?)はポートレットやコンポーネントから変更や参照が可能(コンポーネントが何をさすかは不明)。ポートレットは、supported-public-render-parameter要素をportlet要素の中で定義するようだ。

<public-render-parameter>
<identifier>foo</identifier>
<qname xmlns:x=”http://example.com/params”>x:foo.2</qname>
</public-render-parameter>
<public-render-parameter>
<identifier>bar</identifier>
<qname xmlns:x=”http://example.com/params”>x:foo.bar</qname>
</public-render-parameter>
<portlet>
<portlet-name>portletA</portlet-name>
...
<supported-public-render-parameter>foo</supported-public-renderparameter>
</portlet>
<portlet>
<portlet-name>portletB</portlet-name>
...
<supported-public-render-parameter>bar</supported-public-render-parameter>
</portlet>

ポータルコンテナはsupported-public-render-parameterを使って定義されたポートレットに対して、Public Render Parameter を送る。

レンダーパラメタの吐き出しのURLは奨励されるだけで、ポータル実装では必須ではない。Public Render Parameter は供給されなきゃ、ポートレットでは null として扱われる。ポートレットがレンダーパラメータをnullにセットしたら、ポータルコンテナは削除したものとして扱うべし。公開または非公開レンダーパラメータに関係なく、PortletRequestのgetParameterメソッドでアクセスできる。または、getPrivateParameterMapやgetPublicParameterMapなどでもそれぞれにアクセス可能。(そんなメソッドが追加されたのか・・・)

qname要素でpublic render parameterは特定される。他の方法としては、default-namespace要素でデフォルトの名前空間を指定できるそうな。

あとは、l10nの話で、javax.portlet.app.public-render-parameter.<identifier>.display-name をリソースバンドルで与えれば、表示名を翻訳できるみたい。

PLT.11.1.1.5 Resource Request Parameters

serveResourceリクエストでは、ポートレットはResourceURL上からリソースパラメータを受けとるべし。

PLT.11.1.2 Extra Request Parameters

javax.portlet. で始まるパラメータ名は予約されている。

とりあえず、今日はここまで・・・。PLT.11はまだ長いな・・・。

Jetspeed2 + Fedora Directory Server

LDAPとの連携方法については、http://portals.apache.org/jetspeed-2/multiproject/jetspeed-security/ldap.html に書いてあるから、そこを参照すればいいのだけど、想定しているのが ApacheDS がメイン。そもそも ApacheDS がどの程度、実運用で使われているかわらからんというのがあるけど(私はOpenLDAPとFDSしか使ったことはない・・・)。というわけで、ここはあえて、FDS を試す。ちなみに試したのは、2.1.3のブランチからビルドしたJ2(というかPALポータル)。そのサイトにもあるけど、2.1.2とかじゃ問題があるっぽい(詳細は未確認)。

まず、J2側ですることは、Springの設定ファイルをいじる。以下のような感じ。

$ pushd webapps/palportal/WEB-INF/assembly/override/
$ wget http://people.apache.org/~taylor/LDAP/security-spi-ldap.xml
$ wget http://people.apache.org/~taylor/LDAP/security-spi-ldap-atn.xml
$ wget http://people.apache.org/~taylor/LDAP/security-spi-ldap-atz.xml
$ cd ..
$ mv security-spi-atn.xml security-spi-atz.xml alternate/

次に、security-spi-ldap.xmlを編集。以下のような感じ。indexの 1, 2, 3, 4, 5, 15, 16, 17, 18, 24 あたりを変更すればOK。

<beans>
<!-- ************** Ldap Configuration ************** -->
<bean id="org.apache.jetspeed.security.spi.impl.ldap.LdapBindingConfig"
class="org.apache.jetspeed.security.spi.impl.ldap.LdapBindingConfig">
<!-- The LDAP initial context factory. -->
<constructor-arg index="0"><value>com.sun.jndi.ldap.LdapCtxFactory</value></constructor-arg>
<!-- The LDAP server name. -->
<constructor-arg index="1"><value>ds.hoge.co.jp</value></constructor-arg>
<!-- The LDAP server port. -->
<constructor-arg index="2"><value>389</value></constructor-arg>
<!-- The LDAP server root context. -->
<constructor-arg index="3"><value>dc=hoge,dc=co,dc=jp</value></constructor-arg>
<!-- The LDAP server root dn. -->
<constructor-arg index="4"><value>cn=Directory Manager</value></constructor-arg>
<!-- The LDAP server root password. -->
<constructor-arg index="5"><value>adminpass</value></constructor-arg>
<!-- The roles filter. -->
<constructor-arg index="6"><value>(objectclass=jetspeed-2-role)</value></constructor-arg>
<!-- The groups filter. -->
<constructor-arg index="7"><value>(objectclass=jetspeed-2-group)</value></constructor-arg>
<!-- The user filter. -->
<constructor-arg index="8"><value>(objectclass=jetspeed-2-user)</value></constructor-arg>
<!-- The roleMembershipAttributes. -->
<constructor-arg index="9"><value>j2-role</value></constructor-arg>
<!-- The userRoleMembershipAttributes. -->
<constructor-arg index="10"><value>j2-role</value></constructor-arg>
<!-- The groupMembershipAttributes. -->
<constructor-arg index="11"><value>uniqueMember</value></constructor-arg>
<!-- The userGroupMembershipAttributes. -->
<constructor-arg index="12"><value>j2-group</value></constructor-arg>
<!-- The groupMembershipForRoleAttributes. -->
<constructor-arg index="13"><value>uniqueMember</value></constructor-arg>
<!-- The roleGroupMembershipForRoleAttributes. -->
<constructor-arg index="14"><value></value></constructor-arg>
<!-- The defaultSearchBase. -->
<constructor-arg index="15"><value>dc=hoge,dc=co,dc=jp</value></constructor-arg>
<!-- The roleFilterBase. -->
<constructor-arg index="16"><value>ou=Roles,dc=hoge,dc=co,dc=jp</value></constructor-arg>
<!-- The groupFilterBase. -->
<constructor-arg index="17"><value>ou=Groups,dc=hoge,dc=co,dc=jp</value></constructor-arg>
<!-- The userFilterBase. -->
<constructor-arg index="18"><value>ou=People,dc=hoge,dc=co,dc=jp</value></constructor-arg>
<!-- The roleObjectClasses. -->
<constructor-arg index="19"><value>top,groupOfUniqueNames,jetspeed-2-role</value></constructor-arg>
<!-- The groupObjectClasses. -->
<constructor-arg index="20"><value>top,groupOfUniqueNames,jetspeed-2-group</value></constructor-arg>
<!-- The userObjectClasses. -->
<constructor-arg index="21"><value>top,person,organizationalPerson,inetorgperson,jetspeed-2-user</value></constructor-arg>
<!-- The roleIdAttribute. -->
<constructor-arg index="22"><value>cn</value></constructor-arg>
<!-- The groupIdAttribute. -->
<constructor-arg index="23"><value>cn</value></constructor-arg>
<!-- The userIdAttribute. -->
<constructor-arg index="24"><value>uid</value></constructor-arg>
<!-- The UidAttribute. -->
<constructor-arg index="25"><value>uid</value></constructor-arg>
<!-- The MemberShipSearchScope. -->
<constructor-arg index="26"><value>1</value></constructor-arg>
<!-- The roleUidAttribute. -->
<constructor-arg index="27"><value>cn</value></constructor-arg>
<!-- The groupUidAttribute. -->
<constructor-arg index="28"><value>cn</value></constructor-arg>
<!-- The userUidAttribute. -->
<constructor-arg index="29"><value>uid</value></constructor-arg>
<!-- The roleObjectRequiredAttributeClasses. -->
<constructor-arg index="30"><value>cn,j2-classname,uid,uniquemember</value></constructor-arg>
<!-- The groupObjectRequiredAttributeClasses. -->
<constructor-arg index="31"><value>cn,j2-classname,uid,uniqueMember</value></constructor-arg>
<!-- The userAttributes. -->
<constructor-arg index="32"><value>sn={u},cn={u},uid={u}</value></constructor-arg>
<!-- The roleAttributes. -->
<constructor-arg index="33"><value></value></constructor-arg>
<!-- The groupAttributes. -->
<constructor-arg index="34"><value></value></constructor-arg>
<!-- The userPasswordAttribute. -->
<constructor-arg index="35"><value>userPassword</value></constructor-arg>
<!-- The knownAttributes. -->
<constructor-arg index="36"><value>cn,sn,o,uid,ou,objectClass,userPassword,member,uniqueMember,memberOf,j2-role,j2-group</value></constructor-arg>
</bean>
</beans>

次に、FDSの方の設定(既にFDSの基本設定は完了しているものとする)。まず、/opt/fedora-ds/slapd-ds/config/schema/61jetspeed.ldif というファイルを作り、以下の内容を記述。

dn: cn=schema
attributeTypes: ( 1.3.6.1.4.1.8100.1.2.3.1 NAME ( 'j2-classname' ) DESC 'The java class name of the object.' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Jetspeed 2' )
attributeTypes: ( 1.3.6.1.4.1.8100.1.2.3.2 NAME ( 'j2-action' ) DESC 'An action associated with a permission. This is a multi-valued attribute.' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Jetspeed 2' )
attributeTypes: ( 1.3.6.1.4.1.8100.1.2.3.3 NAME ( 'j2-role' ) DESC 'The UID of an associated Role. This is a multi-valued attribute.' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Jetspeed 2' )
attributeTypes: ( 1.3.6.1.4.1.8100.1.2.3.4 NAME ( 'j2-group' ) DESC 'The UID of an associated Group. This is a multi-valued attribute.' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Jetspeed 2' )
attributeTypes: ( 1.3.6.1.4.1.8100.1.2.3.5 NAME ( 'j2-permission' ) DESC 'The UID of an associated Permission' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 X-ORIGIN 'Jetspeed 2' )
attributeTypes: ( 1.3.6.1.4.1.8100.1.2.3.6 NAME ( 'creation-date' ) DESC 'create date' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE X-ORIGIN 'Jetspeed 2' )
attributeTypes: ( 1.3.6.1.4.1.8100.1.2.3.7 NAME ( 'modified-date' ) DESC 'modified date' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE  X-ORIGIN 'Jetspeed 2' )
objectClasses: ( 1.3.6.1.4.1.8100.1.2.4.1 NAME 'jetspeed-2-group' DESC 'Jetspeed-2 group' SUP ( groupOfUniqueNames ) MUST ( j2-classname $ uid) MAY ( j2-role $ creation-date $ modified-date $ cn $ ou) X-ORIGIN 'Jetspeed 2' )
objectClasses: ( 1.3.6.1.4.1.8100.1.2.4.2 NAME 'jetspeed-2-permission' DESC 'Jetspeed-2 permission' MUST ( j2-classname $ uid) MAY ( j2-action $ creation-date $ modified-date) X-ORIGIN 'Jetspeed 2' )
objectClasses: ( 1.3.6.1.4.1.8100.1.2.4.3 NAME 'jetspeed-2-role' DESC 'Jetspeed-2 role' SUP ( groupOfUniqueNames ) MUST ( j2-classname $ uid) MAY ( creation-date $ modified-date $ cn $ ou) X-ORIGIN 'Jetspeed 2' )
objectClasses: ( 1.3.6.1.4.1.8100.1.2.4.4 NAME 'jetspeed-2-user' DESC 'Jetspeed-2 user' SUP ( inetOrgPerson ) MUST ( cn $ uid) MAY ( j2-role $ j2-group $ j2-permission $ creation-date $ modified-date) X-ORIGIN 'Jetspeed 2' )

これを足したら、FDSを再起動。再起動したら、FDSの管理ツールからj2-roleとか、Object Class が見えるようになる。そしたら、管理ツールから以下のグループ、ロール、ユーザーを追加する。以下のような感じ(uniquememberとかはメンバー追加で追加した値で良いかも)。

dn: cn=admin,ou=Groups,dc=hoge,dc=co,dc=jp
objectClass: jetspeed-2-group
objectClass: groupOfUniqueNames
objectClass: top
cn: admin
j2-classname: admin
uid: admin
uniquemember: admin
dn: cn=user,ou=Groups,dc=hoge,dc=co,dc=jp
objectClass: jetspeed-2-group
objectClass: groupOfUniqueNames
objectClass: top
cn: user
j2-classname: user
uid: user
uniquemember: user
dn: cn=user,ou=Roles,dc=hoge,dc=co,dc=jp
objectClass: jetspeed-2-role
objectClass: groupOfUniqueNames
objectClass: top
cn: user
j2-classname: user
uid: user
uniquemember: user
dn: uid=admin,ou=People,dc=hoge,dc=co,dc=jp
objectClass: organizationalPerson
objectClass: person
objectClass: jetspeed-2-user
objectClass: inetOrgPerson
objectClass: top
cn: admin
givenname: Admin
j2-role: admin
j2-role: manager
j2-role: user
sn: admin
uid: admin
dn: cn=admin,ou=Roles,dc=hoge,dc=co,dc=jp
objectClass: jetspeed-2-role
objectClass: groupOfUniqueNames
objectClass: top
cn: admin
j2-classname: admin
uid: admin
uniquemember: admin
dn: cn=manager,ou=Groups,dc=hoge,dc=co,dc=jp
objectClass: jetspeed-2-group
objectClass: groupOfUniqueNames
objectClass: top
cn: manager
j2-classname: manager
uid: manager
uniquemember: admin
dn: cn=manager,ou=Roles,dc=hoge,dc=co,dc=jp
objectClass: jetspeed-2-role
objectClass: groupOfUniqueNames
objectClass: top
cn: manager
j2-classname: manager
uid: manager
uniquemember: admin

という感じで、ユーザーを追加するときには、ユーザー追加後にjetspeed-2-userのObject Classを与えて、j2-role を設定すれば良い。

以上ができたら、Jetspeed2を起動。すると、adminと作ったユーザーでログインできる。あと、新規ユーザーではユーザー用のPSMLファイルがないので、自動で生成されるように設定する。設定は webapps/palportal/WEB-INF/assembly/pipelines.xml で、

<bean id="jetspeed-pipeline"
class="org.apache.jetspeed.pipeline.JetspeedPipeline"
init-method="initialize"
>
<constructor-arg>
<value>JetspeedPipeline</value>
</constructor-arg>
<constructor-arg>
<list>
<ref bean="capabilityValve"/>
<ref bean="portalURLValve"/>
<ref bean="securityValve"/>
<ref bean="localizationValve"/>
<ref bean="passwordCredentialValve"/>
<ref bean="loginValidationValve"/>
<ref bean="profilerValve"/>
<ref bean="createUserTemplatePagesValve"/>
<ref bean="containerValve"/>
<ref bean="actionValve"/>
<ref bean="resourceValve"/>
<ref bean="DecorationValve" />
<ref bean="headerAggregatorValvePortal"/>
<ref bean="aggregatorValve"/>
<ref bean="cleanUpValve"/>
</list>
</constructor-arg>
</bean>

のような感じで、createUserTemplatePagesValve を加えておく。そうすれば、ログインしたときに webapps/palportal/WEB-INF/pages/_user/template/ からコピーして作ってくれる。