1. 程式人生 > >ZooKeeper之Java客戶端API使用—許可權控制。

ZooKeeper之Java客戶端API使用—許可權控制。

         在ZooKeeper的實際使用中,我們的做法往往是搭建一個共用的ZooKeeper叢集,統一為若干個應用提供服務。在這種情況下,不同的應用往往是不會存在共享資料的使用場景的,因此需要解決不同應用之間的許可權問題。

        為了避免儲存在ZooKeeper伺服器上的資料被其他程序干擾或人為操作修改,需要對ZooKeeper上的資料訪問進行許可權控制(Access Control)。ZooKeeper提供了ACL的許可權控制機制,簡單的講,就是通過設定ZooKeeper伺服器上資料節點的ACL,來控制客戶端對該資料節點的訪問許可權:如果iyge客戶端符合該ACL控制,那麼就可以對其進行訪問,否則將無法操作。針對這樣的控制機制,ZooKeeper提供了多種許可權控制模式(Scheme),分別是world、auth、digest、ip和super。這裡主要是在digest模式下如何進行ZooKeeper的許可權控制。

        開發人員如果要使用ZooKeeper的許可權控制功能,需要在完成ZooKeeper會話建立後,給該會話新增上相關的許可權資訊(AuthInfo)。ZooKeeper客戶端提供了相應的API介面來進行許可權資訊的設定,如下:

addAuthInfo(String scheme, byte[] auth)

API方法的引數說明如下表所示。

引數名 說明
scheme 許可權控制模式,分為world、auth、digest、ip和super
auth 具體的許可權資訊

        該介面主要用於為當前ZooKeeper會話新增許可權資訊,之後凡是通過該會話對ZooKeeper服務端進行的任何操作,都會帶上該許可權資訊。

使用包含許可權資訊的ZooKeeper會話建立資料節點

public class AuthSample {

final static String PATH = "/zk-book-auth_test";

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);

zookeeper.addAuthInfo("digest", "foo:true".getBytes());

zookeeper.create(PATH, "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);

Thread.sleep(Integer.MAX_VALUE);

}

}

        上面這個示例程式就是一個典型的對ZooKeeper會話新增許可權資訊的使用方式。在這個示例中,我們採用了digest模式,同時可以看到其包含的具體許可權資訊是foo:true,這非常類似於username:password的格式。完成許可權資訊的新增後,該示例還使用客戶端會話在ZooKeeper上建立了/zk-book-auth-test節點,這樣該節點就受到了許可權控制。下面我們來看,針對這個資料節點,ZooKeeper是如何進行許可權控制的。

使用無許可權資訊的ZooKeeper會話訪問含許可權資訊的資料節點

public class AuthSample_Get {

final static String PATH = "/zk-book-auth_test";

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper1 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);

zookeeper1.addAuthInfo("digest", "foo:true".getBytes());

zookeeper1.create(PATH, "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);

ZooKeeper zookeeper2 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);

zookeeper2.getData(PATH, false, null);

}

}

        執行程式,輸出異常資訊如下:

        在上面這個示例程式中,我們首先通過一個包含許可權資訊的客戶端會話建立了一個數據節點,然後使用另一個不包含許可權資訊的客戶端會話對其進行訪問,執行程式後,輸出了異常資訊:KeeperErrorCode = NoAuth for /zk-book-auth_test。可見,一旦我們對一個數據節點設定了許可權資訊,那麼其他沒有許可權設定的客戶端會話將無法訪問該資料節點。ZooKeeper服務端能夠為我們實現許可權控制。

使用錯誤許可權資訊的ZooKeeper會話訪問含許可權資訊的資料節點

// 使用錯誤許可權資訊的ZooKeeper會話訪問含許可權資訊的資料節點

public class AuthSample_Get2 {

final static String PATH = "/zk-book-auth_test";

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper1 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);

zookeeper1.addAuthInfo("digest", "foo:true".getBytes());

zookeeper1.create(PATH, "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);

ZooKeeper zookeeper2 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);

zookeeper2.addAuthInfo("digest", "foo:true".getBytes());
System.out.println(zookeeper2.getData(PATH, false, null ));

ZooKeeper zookeeper3 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);

zookeeper3.addAuthInfo("digest", "foo:false".getBytes());

zookeeper3.getData(PATH, false, null);

}

}

        執行程式,輸出結果如下:

        在上面這個示例程式中,我們同樣使用包含許可權資訊的客戶端會話建立了資料節點,同時使用了兩個許可權資訊,先後進行了兩次資料節點內容的獲取。第一次,我們使用了正確的許可權資訊,即digest[foo:true],同時也成功獲取到了資料節點的資料內容:[[email protected];而在第二次介面呼叫中,由於使用了錯誤的許可權資訊,即digest[foo:false],結果出現異常:KeeperErrorCode = NoAuth for /zk-book-auth_test。可見,ZooKeeper的許可權控制也能夠為我們識別出錯誤的許可權資訊。

        在ZooKeeper中,幾乎所有的API介面操作,其許可權控制策略都是和上面幾個示例類似的,但是對於刪除節點(delete)介面而言,其許可權控制比較特殊。

刪除節點介面的許可權控制

// 刪除節點介面的許可權控制

public class AuthSample_Delete {

final static String PATH = "/zk-book-auth_test";

final static String PATH2 = "/zk-book-auth_test/child";

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper1 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);

zookeeper1.addAuthInfo("digest", "foo:true".getBytes());

zookeeper1.create(PATH, "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);

zookeeper1.create(PATH2, "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);

try {
ZooKeeper zookeeper2 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);
zookeeper2.delete(PATH2, -1);
} catch (Exception e) {
System.out.println("刪除節點失敗:" + e.getMessage());

}
ZooKeeper zookeeper3 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);
zookeeper3.addAuthInfo("digest", "foo:true".getBytes());
zookeeper3.delete(PATH2, -1);
System.out.println("成功刪除節點:" + PATH2);

ZooKeeper zookeeper4 = new ZooKeeper("domain1.book.zookeeper:2181", 50000, null);
zookeeper4.delete(PATH, -1);
System.out.println("成功刪除節點:" + PATH);

}

}

        執行程式,輸出結果如下:

         在上面這個示例程式中,第一次,我們使用沒有包含許可權資訊的客戶端會話進行資料節點刪除操作,顯然,程式執行程式中丟擲了異常資訊:KeeperErrorCode = NoAuth for /zk-book-auth_test/child。而在第二次介面呼叫中,由於使用了正確的許可權資訊,因此成功刪除了資料節點,相信這也不難理解。

        下面我們著重來看第三次節點刪除操作。需要注意的是,在這次刪除操作中,我們使用的是沒有包含許可權資訊的客戶端會話,但最終卻成功刪除了資料節點。從這個例子中,我們可以看到,刪除節點介面的許可權控制比較特殊,當客戶端對一個數據節點添加了許可權資訊後,對於刪除操作而言,其作用範圍是其子節點。也就是說,當我們對一個數據節點新增資訊後,依然可以自由的刪除這個節點,但是對於這個節點的子節點,就必須使用相應的許可權資訊才能夠刪除掉他。

相關推薦

ZooKeeperJava客戶API使用—許可權控制

         在ZooKeeper的實際使用中,我們的做法往往是搭建一個共用的ZooKeeper叢集,統一為若干個應用提供服務。在這種情況下,不同的應用往往是不會存在共享資料的使用場景的,因此需要解決不同應用之間的許可權問題。         為了避免儲存在ZooKee

ZooKeeperJava客戶API使用—刪除節點

        客戶端可以通過ZooKeeper的API來刪除一個節點,有如下兩個介面: public void delete(final String path, int version)public void delete(final String path, int

ZooKeeperJava客戶API使用—讀取資料

        讀取資料,包括子節點列表的獲取和節點資料的獲取。ZooKeeper分別提供了不同的API來獲取資料。 getChildren         客戶端可以通過ZooKeeper的API來獲取一個節點的所有子節點,有如下8個介面可供使用: List<Str

Zookeeperjava客戶API使用方法(五)

前面幾篇博文,我們簡單的介紹了一下zookeeper,如何安裝zookeeper叢集,以及如何使用命令列等。這篇博文我們重點來看下Zookeeper的java客戶端API使用方式。 建立會話 客戶端可以通過建立一個Zookeeper(org.apache

Zookeeperjava客戶API

zookeeper-api基本使用 org.apache.zookeeper.Zookeeper是客戶端入口主類,負責建立與server的會話。它提供了以下 所示幾類主要方法。 demo增刪改查 我們先修改一下本地的hosts檔案 並且測試一下:

zookeeper java 客戶ACL許可權 使用

zookeeper 提供許可權認證作為zookeeper客戶端訪問的限制,主要有兩種方式,1、IP模式   2、 digest許可權模式 可以通過建立節點時定義許可權內容。以下是java的實現 package com.aicong.test.helloZookeeper;

讀《分布式一致性原理》JAVA客戶API操作

rst org RoCE row out 錯誤 throws eat 服務 創建會話 客戶端可以通過創建一個Zookeeper實例來連接服務器。4種構造方法如下 ZooKeeper(connectString, sessionTimeout, watcher);

讀《分布式一致性原理》JAVA客戶API操作2

open size 改變 網絡通 調用 異常 pat ride aca 創建節點 通過客戶端API來創建一個數據節點,有一下兩個接口: public String create(final String path, byte data[], List<ACL&

大資料教程(7.4)HDFS的java客戶API(流處理方式)

        博主上一篇部落格分享了namenode和datanode的工作原理,本章節將繼前面的HDFS的java客戶端簡單API後深度講述HDFS流處理API。       &nb

ZooKeeperJava客戶工具使用(Curator)

安裝 <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> <vers

HDFS的java客戶api的基本使用

package hdfs1; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.C

RabbitMQ的Java客戶API指南

目前RabbitMQ官方的Java客戶端版本已升至5.0.0,5.x系列的版本需要JDK 8支援,4.x系列的版本支援JDK 6。 1、綜述 RabbitMQ Java客戶端使用com.rabbitmq.client作為頂層包。有4個關鍵類和介面:Channel、Conn

RabbitMQ Java客戶API指南

本指導覆蓋了Java客戶端api,它不僅僅是一個教程,在不同的部分都是可用的。 此java客戶端得到了下面三方的許可 Apache Public License 2.0 Mozilla Public License GPL 2.0 概要 Rabbi

ZookeeperJava客戶(要把zookeeper用的足夠熟練,才能說掌握了它)

zookeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,由於產品升級拓展,pom等檔案配置越來越複雜,因此zk派上用場 一.zookee

單點登入(十八)----cas4.2.x客戶增加許可權控制shiro

我們在上面章節已經完成了cas4.2.x登入啟用mongodb的驗證方式。也完成了獲取管理員身份屬性現在需要做的就是給客戶端 cas client加上 許可權控制。許可權控制可以使用spring Security或者shiro。安全框架Shiro和Spring Securit

RabbitMQ學習Java客戶連線測試(二)

前面花了幾天糾結完RabbitMQ在Linux下的安裝之後,開始找簡單的例子來測試RabbitMQ和Java的連線。 和前面的安裝一樣,問題依舊。因為網上的帖子大多數都是很正常的步驟,並且沒有貼出來自己途中可能遇到的低階錯誤。 本文將沿用網上很經典的一個帖子來說出我過程中出

Redis—— java客戶連結不上redis解決方案

出現問題描述: 1.Could not get a resource from the pool, Connection refused: connect windows java這邊客戶端連結被拒接了,想想問題 1.Vmware裡面的linux所安裝的redis已

zookeeperjava客戶

需要jar 包: 安裝目錄 zookeeper-3.4.9.jar lib包下jar包 package com.bigdata.zk; import java.io.IOException; import java.util.List; import org.apac

Zookeeper開源客戶ZkClient

ZkClient是由Datameer的工程師開發的開源客戶端,對Zookeeper的原生API進行了包裝,實現了超時重連、Watcher反覆註冊等功能。 ZKClient版本及原始碼 maven依賴 ZkClient目前有兩個不同artifactI

Zookeeper客戶API讀取子節點列表(八)

本篇部落格介紹一下Zookeeper原生客戶端API提供的獲取子節點列表方法。 獲取子節點列表方法 方法 Zookeeper原生客戶端API提供了以下8中獲取子節點列表的方法,每個方法的使用說明參考註釋內容: /** * 返回指定路徑下面的子節點列