Использование ACL с куратором

Используя CuratorFramework, кто-нибудь может объяснить, как я могу:

  • Создайте новый путь
  • Установить данные для этого пути
  • Получить этот путь

Использование имени пользователя foo и пароля bar? Те, кто не знает этого пользователя/прохода, ничего не смогут сделать.

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

Ответы

Ответ 1

ACL в Apache Curator предназначены для контроля доступа. Поэтому ZooKeeper не предоставляет никакого механизма аутентификации, например, clients who don't have correct password cannot connect to ZooKeeper or cannot create ZNodes. Он может сделать это, не позволяя несанкционированным клиентам получать доступ к определенным Znode/ZNodes. Для этого вам необходимо настроить экземпляр CuratorFramework, как я описал ниже. Помните, что это гарантирует, что создание ZNode с данным ACL может быть снова доступно одним клиентом или клиентом, представляющим ту же информацию аутентификации.

Сначала вы должны создать CuratorFramework instane следующим образом. Здесь connectString означает разделенный запятыми список комбинаций ip and port серверов zookeeper в вашем ансамбле.

CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
                .connectString(connectString)
                .retryPolicy(new ExponentialBackoffRetry(retryInitialWaitMs, maxRetryCount))
                .connectionTimeoutMs(connectionTimeoutMs)
                .sessionTimeoutMs(sessionTimeoutMs);
    /*
     * If authorization information is available, those will be added to the client. NOTE: These auth info are
     * for access control, therefore no authentication will happen when the client is being started. These
     * info will only be required whenever a client is accessing an already create ZNode. For another client of
     * another node to make use of a ZNode created by this node, it should also provide the same auth info.
     */
    if (zkUsername != null && zkPassword != null) {
        String authenticationString = zkUsername + ":" + zkPassword;
        builder.authorization("digest", authenticationString.getBytes())
                .aclProvider(new ACLProvider() {
                    @Override
                    public List<ACL> getDefaultAcl() {
                        return ZooDefs.Ids.CREATOR_ALL_ACL;
                    }

                    @Override
                    public List<ACL> getAclForPath(String path) {
                        return ZooDefs.Ids.CREATOR_ALL_ACL;
                    }
                });
    }

CuratorFramework client = builder.build();

Теперь вы должны запустить его.

client.start();

Создание пути.

client.create().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path");

Здесь CreateMode укажите тип node, который вы хотите создать. Доступные типы PERSISTENT,EPHEMERAL,EPHEMERAL_SEQUENTIAL,PERSISTENT_SEQUENTIAL,CONTAINER. Java Docs

Если вы не знаете, существует ли путь до /your/ZNode, вы также можете создать их.

client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path");

Установить данные

Вы можете либо установить данные при создании ZNode, либо позже. Если вы устанавливаете данные во время создания, передайте данные как массив byte в качестве второго параметра методу forPath().

client.create().withMode(CreateMode.PERSISTENT).forPath("/your/ZNode/path","your data as String".getBytes());

Если вы делаете это позже, (данные должны быть заданы как массив байтов)

client.setData().forPath("/your/ZNode/path",data);

Наконец

Я не понимаю, что вы подразумеваете под get this path. Apache Curator - это java-клиент (более чем с кураторскими рецептами), которые используют Apache Zookeeper в фоновом режиме и скрывают краевые случаи и сложности Zookeeper. В Zookeeper они используют концепцию ZNodes для хранения данных. Вы можете рассматривать его как структуру каталогов Linux. Все ZNodePaths должны начинаться с / (root), и вы можете продолжать указывать каталог, такой как ZNodePaths, как вам нравится. Пример: /someName/another/test/sample.

Структура ZNode

Как показано на приведенной выше диаграмме, ZNode организованы в древовидную структуру. Каждый ZNode может хранить до 1 МБ данных. Поэтому, если вы хотите получить данные, хранящиеся в ZNode, вам нужно знать путь к этому ZNode. (Так же, как вы должны знать таблицу и столбец базы данных, чтобы извлекать данные).

Если вы хотите получить данные по заданному пути,

client.getData().forPath("/path/to/ZNode");

Это все, что вам нужно знать, когда вы хотите работать с куратором.

Еще одна вещь

ACL в Apache Curator предназначены для контроля доступа. То есть, если вы установите ACLProvider следующим образом,

new ACLProvider() {
    @Override
    public List<ACL> getDefaultAcl () {
        return ZooDefs.Ids.CREATOR_ALL_ACL;
    }

    @Override
    public List<ACL> getAclForPath (String path){
        return ZooDefs.Ids.CREATOR_ALL_ACL;
    }
}

только клиенту с учетными данными, идентичными создателю, будет предоставлен доступ к соответствующему ZNode позже. Сведения о постановке на охрану устанавливаются следующим образом (см. Пример построения клиента). Существуют другие режимы ACL, например OPEN_ACL_UNSAFE, которые не выполняют никакого контроля доступа, если вы установите его как ACLProvider.

authorization("digest", authorizationString.getBytes())

они будут использоваться позже для управления доступом к данному ZNode.

Короче говоря, если вы хотите, чтобы другие не вмешивались в ваши ZNodes, вы можете установить ACLProvider для возврата CREATOR_ALL_ACL и установить авторизацию на digest, как показано выше. Только экземпляры CuratorFramework, использующие одну и ту же строку авторизации ("username:password"), смогут получить доступ к этим ZNodes. Но это не помешает другим создавать ZNodes по пути, которые не мешают вам.

Надеюсь, вы нашли то, что хотите: -)