1. 程式人生 > >(七)、ZooKeeper 授權驗證

(七)、ZooKeeper 授權驗證

1.Zookeeper許可權介紹

ZooKeeper 的許可權管理亦即 ACL 控制功能通過 Server 、 Client 兩端協調完成:

Server 端:
一個 ZooKeeper 的節點( znode )儲存兩部分內容:資料和狀態,狀態中包含 ACL 資訊。建立一個 znode 會產生一個 ACL 列表,列表中每個 ACL 包括:
  • 驗證模式 (scheme)
  • 具體內容 (Id) (當 scheme=“digest” 時,Id 為使用者名稱密碼,例如 “root :J0sTy9BCUKubtK1y8pkbL7qoxSw=” )
  • 許可權 (perms) 

1.1 scheme

  • ZooKeeper 提供瞭如下幾種驗證模式( scheme ):
  • digest : Client 端由使用者名稱和密碼驗證,譬如 user:password , digest 的密碼生成方式是 Sha1 摘要的 base64 形式
  • auth : 不使用任何 id ,代表任何已確認使用者。
  • ip : Client 端由 IP 地址驗證,譬如 172.2.0.0/24
  • world :固定使用者為 anyone ,為所有 Client 端開放許可權
  • super :在這種 scheme 情況下,對應的 id 擁有超級許可權,可以做任何事情 (cdrwa )
注意的是, exists 操作和 getAcl 操作並不受 ACL 許可控制,因此任何客戶端可以查詢節點的狀態和節點的 ACL 。 

1.2  perms

節點的許可權( perms )主要有以下幾種:
  • Create 允許對子節點 Create 操作
  • Read 允許對本節點 GetChildren 和 GetData 操作
  • Write 允許對本節點 SetData 操作
  • Delete 允許對子節點 Delete 操作
  • Admin 允許對本節點 setAcl 操作 

2.Java程式碼

2.1、建立時指定使用者和密碼、schema型別。

<span style="white-space:pre">	</span>private String auth = "";
	private List<ACL> acls = null;
	
	public ZKOperate(String userName,String password){
		try {
			auth = userName + ":" +password;
			Id id = new Id("digest",DigestAuthenticationProvider.generateDigest(auth));
			ACL acl = new ACL(ZooDefs.Perms.ALL, id); 
			acls = Collections.singletonList(acl); 
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
設定之後,對應操作Zookeeper資訊,需要匹配使用者名稱和密碼。