Мы используем Jackrabbit 2.2.7 для разработки репозитория для XML-документов.
Мы хотим создать группу пользователей для репозитория и обеспечить некоторые виды прав доступа только для чтения и чтения-записи вих.Мы использовали ACL на основе ресурсов, как описано здесь .Разрешение только для чтения работает как очарование.Тем не менее, нам трудно заставить работать чтение и запись, когда пользователь пытается создать / удалить узел, который является версионным (mix:versionable
), даже если мы предоставляем ему максимально возможную привилегию, Privilege.JCR_ALL
.До сих пор мы поняли, что модификация версионного узла на самом деле не проста.В Jackrabbit это охватывает несколько узлов - /jcr:system/jcr:versionStorage
является одним из них.Кажется, что если пользователь сам не является администратором, он не может внести изменения в /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();
}