zookeeper的ACL(访问控制)
2019-10-08 本文已影响0人
Audience0
ACL(Access Control List),Zookeeper 作为一个分布式协调框架,其内部存储的都是一些关于分布式系统运行时状态的元数据,默认情况下,所有应用都可以读取任何节点,在复杂的应用中,不太安全,ZK通过ACL机制来解决访问权限问题。
image.pngscheme:world表示全世界
id:anyone表示所有人
Permissions:read,write,create,detele,admin
以上表示显示任何人都可以对他增删改查管理.
控制方式
1.IP方式:
通过IP地址粒度进行权限控制模式
2.digest:
digest是最常用的权限控制模式,采用username:password形式进行权限管理,ZK会对形成的权限标识先后进行两次加密处理,分别是SHA-1加密算法和Base64编码
3.world:
world是一种最开放的控制模式,任何人都可以访问
4:auth:
不适用任何id,代表任何已认证的用户
zookeeper节点操作权限分为五种:
read,write,create,detele,admin
读,写,创建,删除,管理
查看ACL
image.png
增加认证用户或者说是登陆
image.png
添加权限
image.png
/**
* 为zookeeper增加权限
* 具有创建权限的可以创建子节点,创建时可以指定权限,如不指定则是anyone
* 不具有创建权限的不可以创建子节点,但是可以创建非该节点 子节点的其他节点
*
* 创建用户ID的时候 注意加密
*/
public class CuratorAcl {
private CuratorFramework client;
private static final String ACL_Path = "/acl1";
private static final String ZK_ADRESS = "127.0.0.1";
public CuratorAcl() {
//client = CuratorFrameworkFactory.newClient(ZK_ADRESS,new RetryNTimes(3,10));
client = CuratorFrameworkFactory.builder()
//.authorization("digest","zhangsan:123".getBytes())
//.authorization("digest","wangwu:123".getBytes())
.authorization("digest","lisi:123".getBytes())
.connectString(ZK_ADRESS)
.retryPolicy(new RetryNTimes(3,200))
.sessionTimeoutMs(100)
.connectionTimeoutMs(1000000)
.build();
client.start();
}
public static void main(String[] args) throws Exception {
CuratorAcl curatorAcl = new CuratorAcl();
if (CuratorFrameworkState.STARTED.name().equals(curatorAcl.client.getState().name())){
System.out.println("curator 连接成功");
/*List<ACL> aclList = new ArrayList<>();
Id zhangsan = new Id("digest", DigestAuthenticationProvider.generateDigest("zhangsan:123"));
Id lisi = new Id("digest", DigestAuthenticationProvider.generateDigest("lisi:123"));
aclList.add(new ACL(ZooDefs.Perms.ALL,zhangsan));
aclList.add(new ACL(ZooDefs.Perms.READ,lisi));*/
//创建节点
/* curatorAcl.client.create().creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT)//指定节点类型
.withACL(aclList)//指定权限
.forPath(ACL_Path,"acl".getBytes());*/
//修改数据
//curatorAcl.client.setData().withVersion(-1).forPath(ACL_Path,"acl6".getBytes());
//System.out.println(new String(curatorAcl.client.getData().forPath(ACL_Path)));
/*List<ACL> acls = curatorAcl.client.getACL().forPath(ACL_Path);
acls.add(new ACL(ZooDefs.Perms.READ | ZooDefs.Perms.CREATE |ZooDefs.Perms.WRITE,new Id("digest",DigestAuthenticationProvider.generateDigest("wangwu:123"))));
curatorAcl.client.setACL()
.withACL(acls)
.forPath(ACL_Path);*/
Stat stat = new Stat();
System.out.println(new String(curatorAcl.client.getData().storingStatIn(stat).forPath(ACL_Path+"/acl")));
curatorAcl.client.setData().withVersion(stat.getVersion()).forPath(ACL_Path+"/acl","s1f".getBytes());
List<ACL> acls = curatorAcl.client.getACL().forPath(ACL_Path + "/acl");
System.out.println(new String(curatorAcl.client.getData().storingStatIn(stat).forPath(ACL_Path+"/acl")));
/*curatorAcl.client.create().creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT)//指定节点类型
// .withACL(aclList)//指定权限
.forPath(ACL_Path + "/acl1","acl".getBytes());*/
}
}
}