Добавление ограничений к спискам ACL дает пустые результаты для запросов в дубе Jackrabbit - PullRequest
0 голосов
/ 20 января 2019

Используя Jackrabbit Oak, я пытался настроить безопасность через SecurityProvider и SecurityConfiguration s.В частности, я использовал ограничения, которые обычно работают, как ожидалось.Однако при работе с JCR-SQL2 запросами отфильтровывается больше, чем ожидалось.

Подробности

Это можно воспроизвести с помощью репозитория ниже.

/
  node          [nt:unstructured]
    subnode     [nt:unstructured]

В node я добавляю запись контроля доступа с привилегией JCR_ALL для user вместе с ограничением для rep:glob -> "", так что user не имеет доступа ни к каким дочерним элементамnode.

Работает как положено при использовании session.getNode:

  • session.getNode("/node") возвращает узел
  • session.getNode("/node/subnode"), выбрасывает PathNotFoundException какожидается из-за ограничения.

Однако, когда я выполняю следующий JCR-SQL2 запрос:

SELECT * FROM [nt:unstructured]

, я получаю никаких результатов назад .Здесь я бы ожидал получить /node, так как в противном случае он доступен при использовании session.getNode.

Код

public static void main(String[] args) throws Exception {
    Repository repository = new Jcr().with(new MySecurityProvider()).createRepository();
    Session session = repository.login(new UserIdCredentials(""));    // principal is "SystemPrincipal.INSTANCE"

    // Create nodes
    Node node = session.getRootNode().addNode("node", "nt:unstructured");
    node.addNode("subnode", "nt:unstructured");

    // Add access control entry + restriction
    AccessControlManager acm = session.getAccessControlManager();
    JackrabbitAccessControlList acl = (JackrabbitAccessControlList) acm
        .getApplicablePolicies("/node").nextAccessControlPolicy();
    Privilege[] privileges = new Privilege[]{acm.privilegeFromName(Privilege.JCR_ALL)};
    Map<String, Value> restrictions = new HashMap<String, Value>() {{put("rep:glob", new StringValue(""));}};
    acl.addEntry(new PrincipalImpl("user"), privileges, true, restrictions);
    acm.setPolicy("/node", acl);
    session.save();

    // executes query
    RowIterator rows = repository.login(new UserIdCredentials("user")).getWorkspace().getQueryManager()
        .createQuery("SELECT * FROM [nt:unstructured]", Query.JCR_SQL2).execute().getRows();
        System.out.println("Number of rows: " + rows.getSize());  //Prints 0
}

Если удалить один restrictions из приведенного выше кода, node и subnode отображаются в результатах запроса, как и ожидалось.

MySecurityProvider использует ConfigurationParameters.EMPTY и реализации по умолчанию всех SecurityConfiguration с, кроме AuthenticationConfiguration, который я сам реализовал:

class MyAuthenticationConfiguration extends AuthenticationConfigurationImpl {
    public MyAuthenticationConfiguration(SecurityProvider securityProvider) {
        super(securityProvider);
    }

    @NotNull
    @Override
    public LoginContextProvider getLoginContextProvider(ContentRepository contentRepository) {
        return new LoginContextProvider() {
            @NotNull
            public LoginContext getLoginContext(Credentials credentials, String workspaceName) {
                String userId = ((UserIdCredentials) credentials).getUserId();
                Set<Principal> principalSets = new HashSet<>();
                if (userId.isEmpty()) {
                    principalSets.add(SystemPrincipal.INSTANCE);
                } else {
                    principalSets.add(new PrincipalImpl(userId));
                }
                Map<String, ? extends Principal> publicPrivileges = new HashMap<>();
                AuthInfoImpl authInfoImpl = new AuthInfoImpl(userId, publicPrivileges, principalSets);
                Subject subject = new Subject(true, principalSets, Collections.singleton(authInfoImpl), new HashSet<Principal>());
                return new PreAuthContext(subject);
            }
        };
    }
}

Я использую Дуб Дубарей версии 1.10.0

1 Ответ

0 голосов
/ 03 февраля 2019

Это оказалось ошибкой в ​​дубе Крольчонка - Ссылка на выпуск .

Это исправлено с версии 1.11.0

...