Jackrabbit 2.2.7 を使用して、xml ドキュメントのリポジトリを開発しています。
リポジトリ用に多数のユーザーを作成し、それらに対して何らかの読み取り専用および読み取り/書き込みアクセス権限を適用したいと考えています。こちら で説明されているように、リソース ベースの ACL を使用しました。読み取り専用許可は魅力として機能します。ただし、ユーザーがバージョン管理可能なノード ( ) を作成/削除しようとすると、mix:versionable可能な限り最高の特権Privilege.JCR_ALL. これまでのところ、バージョン管理されたノードへの変更は実際には単純ではないことがわかりました。Jackrabbit では、複数のノードにまたがっており/jcr:system/jcr:versionStorage、そのうちの 1 つです。/jcr:system/ユーザーが管理ユーザー自身でないと、 とその子ノードを変更できないようです。
だから私の質問は
- a) 通常のユーザーがバージョン管理可能なノードを変更できるようにする方法はありますか?
- b) jackrabbit で複数の管理者ユーザーを作成する方法はありますか (ポインター、ウィキ、コード スニペット)?
のセキュリティ セクションは次のrepository.xmlとおりです。
<Security appName="Jackrabbit">
<SecurityManager class="org.apache.jackrabbit.core.DefaultSecurityManager"
workspaceName="security">
<!-- <WorkspaceAccessManager class="..."/> -->
<!-- <param name="config" value="${rep.home}/security.xml"/> -->
</SecurityManager>
<AccessManager
class="org.apache.jackrabbit.core.security.DefaultAccessManager">
<!-- <param name="config" value="${rep.home}/access.xml"/> -->
</AccessManager>
<LoginModule
class="org.apache.jackrabbit.core.security.authentication.DefaultLoginModule">
<!--
anonymous user name ('anonymous' is the default value)
-->
<param name="anonymousId" value="anonymous"/>
<!--
administrator user id (default value if param is missing is 'admin')
-->
<param name="adminId" value="admin"/>
</LoginModule>
</Security>
ユーザーを作成してアクセス制御を有効にする方法は次のとおりです。
{
...
JackrabbitSession js = (JackrabbitSession) session;
UserManager um = js.getUserManager();
Authorizable grp = um.getAuthorizable("usergroup");
Group userGroup = null;
if(grp == null){
userGroup = um.createGroup("usergroup");
}else{
userGroup = (Group) grp;
}
User user = um.createUser(newUserName, newUserPass);
userGroup.addMember(user);
Node node = session.getNode("/root");
AccessControlManager acm = session.getAccessControlManager();
AccessControlList acl = getList(acm, node.getPath());
Privilege[] privileges = null ;
if(privilege.equals("r")){
privileges = new Privilege[]
{
acm.privilegeFromName(Privilege.JCR_READ),
acm.privilegeFromName(Privilege.JCR_LOCK_MANAGEMENT)
};
}else if(privilege.equals("rw")){
privileges = new Privilege[]
{
acm.privilegeFromName(Privilege.JCR_ALL)
};
}else{
return;
}
acl.addAccessControlEntry(new PrincipalImpl(user.getID()), privileges);
acm.setPolicy(node.getPath(), acl);
session.save();
}