(七)、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信息,需要匹配用户名和密码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章