Jackrabbit управление пользователями - PullRequest
5 голосов
/ 16 июня 2011

Я с трудом найду документацию о том, как спроектировать и построить хранилище для нескольких пользователей.

Я довольно новичок в Jackrabbit и всегда использовал одни учетные данные главного пользователя для создания хранилища, к которому обращался только один основной пользователь.

Теперь мне нужен репозиторий, который используется тысячами пользователей, и каждый пользователь работает со своими узлами и не имеет прав доступа к другим.

SimpleAccessManager довольно прост:

public boolean isGranted(ItemId id, int permissions) throws RepositoryException {
    checkInitialized();
    if (system) {
        // system has always all permissions
        return true;
    } else if (anonymous) {
        // anonymous is always denied WRITE & REMOVE permissions
        if ((permissions & WRITE) == WRITE
                || (permissions & REMOVE) == REMOVE) {
            return false;
        }
    }

    return true;
}

Похоже, что невозможно создать такой многопользовательский репозиторий с SimpleLoginModule и SimpleAccessManager. Потому что он различает только ADMIN и анонимных пользователей, которые могут читать все, но не могут писать ...

Так что нужно использовать DefaultAccessManager и, возможно, сделать что-то вроде этого:

Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray())); 

UserManager um = ((JackrabbitSession) session).getUserManager(); 
User user = um.createUser("john", "doe"); 

/*   And assign some ALC as follows... And then play with it like this, which really sucks without proper documentation, one has to reverse engineer everything, wtf */

AccessControlManager acm = session.getAccessControlManager();     
AccessControlPolicyIterator it = acm.getApplicablePolicies(testRootNode.getPath()); 
while ( it.hasNext() ) { 
    AccessControlPolicy acp = it.nextAccessControlPolicy(); 

    Privilege[] privileges = new Privilege[]{acm.privilegeFromName(Privilege.JCR_WRITE)}; 

    ((AccessControlList)acp).addAccessControlEntry(new PrincipalImpl(user.getUserID()), privileges); 

    acm.setPolicy(testRootNode.getPath(), acp); 
} 

Хранилище будет доступно через OpenCMIS, который предоставляет учетные данные пользователя от клиента.

РЕДАКТИРОВАТЬ: это то, что я искал AccessControl

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

Я не уверен, что все необходимые шаги, но вы могли бы взглянуть на репозиторий Hippo CMS, который основан на Apache JackRabbit. Это CMS с открытым исходным кодом и репозиторий контента, в котором реализовано собственное управление пользователями на основе доменов и аспектов.

Вы можете найти источник обеспечения безопасности Hippo CMS здесь .

2 голосов
/ 17 июня 2011

Если вам нужен репозиторий с «тысячами пользователей», вам лучше использовать модуль входа в систему JAAS, который аутентифицирует пользователей на основе некоторой внешней системы (LDAP или базы данных и т. Д.) И предоставляет роли. Сеанс возвращается при входе в репозиторий с использованием имени рабочей области и необязательных учетных данных. И как вы можете видеть здесь: http://www.day.com/maven/javax.jcr/javadocs/jcr-2.0/javax/jcr/Session.html сеанс предоставляет доступ только к тем узлам, к которым у пользователя есть доступ.

Если вам необходимо применить различные элементы управления доступом, очевидно, что SimpleAccessManager по умолчанию вам недостаточно, поэтому вам может потребоваться реализовать собственный AccessManager.

0 голосов
/ 16 июня 2011

Из документации

элемент конфигурации безопасности используется для указания параметров аутентификации и авторизации для репозитория

См. Документы конфигурации JackRabbit Security для получения дополнительной информации.

...