Устранение неполадок при использовании ACL для чтения и записи для пользователей Jackrabbit на версионных узлах - PullRequest
2 голосов
/ 18 ноября 2011

Мы используем 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();
 }

1 Ответ

1 голос
/ 03 декабря 2011

Содержимое внутри /jcr:system/jcr:versionStorage не может быть изменено напрямую. Вам необходимо использовать интерфейс VersionManager для создания, удаления или маркировки версий в хранилище версий. Любой пользователь с доступом на запись к версионному узлу должен быть в состоянии сделать это, так как нет дополнительных элементов управления доступом, которые применяются к хранилищу версий.

Что касается самих версионных узлов, обратите внимание, что при регистрации они только для чтения . Вам необходимо явно извлечь версионный узел, чтобы сделать это доступно для записи.

...