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/ からコピーして作ってくれる。