> For the complete documentation index, see [llms.txt](https://xiaoxiami.gitbook.io/zookeeper/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaoxiami.gitbook.io/zookeeper/zookeeper-cao-zuo-ming-ling/quan-xian-acl-ming-ling.md).

# ACL权限控制命令

针对节点可以设置相关读写等权限，目的为了保障数据安全性

权限permissions可以指定不同的权限范围以及角色

## ACL命令行

getAcl：获取某个节点的acl权限信息，语法：`getAcl path`

setAcl：设置某个节点的acl权限信息,语法：`setAcl path`

addauth：输入认证权限信息，注册时输入明文密码（登录），但是在zk的系统里，密码是以加密的形式存在的。语法：`addauth scheme auth`

```
#连接zk
$ zkCli.sh -server 127.0.0.1:2181
$ create /test 123
$ create /test/abc aaa
# 查看默认权限
$ getAcl /test/abc
'world,'anyone
:cdrwa
```

## ACL的构成

zk的acl通过`[scheme:id:permissions]`来构成权限列表

* scheme：代表采用某种权限机制
* id：代表运行访问的用户
* permissions：权限组合字符串

**scheme**

* world：world下只有一个id，即只有一个用户，也就是anyone，那么组合的写法就是`world:anyone:[permissions]`
* auth：代表认证登录，需要注册用户有权限就可以，形成为`auth:user:password:[permissions]`
* digest：需要对密码加密才能访问，组合形式为`digest:username:BASE64(SHA1(password)):[permissions]`

简而言之，auth与digest的区别就是，前者明文，后者密文，`setAcl/path auth:lee:lee:cdrwa`与`setAcl/path auth:lee:BASE64(SHA1(lee)):cdrwa`是等价的，在通过`addauth digest lee:lee`后都能啊哦做指定节点的权限

* ip：当设置为ip指定的ip地址，此时限制ip进行访问，比如`ip:192.168.1.1:[permissions]`
* super：代表超级管理员，拥有所有的权限。

**permissions**

权限字符串缩写：crdwa

* CREATE：创建子节点
* READ：获取节点/子节点
* WRITE：设置节点数据
* DELETE：删除子节点
* ADMIN：设置分配以上权限的权利

## ACL命令行学习

### `world:anyone:cdrwa`

操作

```
$ ls /testacl
$ create /testacl/abc aa
$ getAcl /testacl/abc
#默认权限结果
'world,'anyone
:cdrwa
# 设置权限，并且其子节点没有删除权限*（不过 加a权限，后面将无法重新设置权限）
$ setAcl /testacl/abc world:anyone:crwa
# 查看权限
$ getAcl /testacl/abc
$ create /testacl/abc/bcd 123
$ delete /testacl/abc/bcd
# 权限结果
Authentication is not valid : /testacl/abc/bcd

# 重新设置权限
$ setAcl /testacl/abc world:anyone:rda
# 查看权限
$ getAcl /testacl/abc
# 成功删除
$ delete /testacl/abc/bcd
# ls /testacl/abc

# 重新设置权限，只能设置权限
$ setAcl /testacl/abc world:anyone:a
$ get /testacl/abc
# 结果无权限
Authentication is not valid : /testacl/abc
$ set /testacl/abc 123 
# 结果无权限
Authentication is not valid : /testacl/abc
# 重新设置权限，只能设置权限
$ setAcl /testacl/abc world:anyone:wa
# 设置完成，但没有读权限
$ set /testacl/abc 123
```

* `auth:user:pwd:cdrwa`
* digest:user:BASE64(SHA1(pwd)):cdrwa
* `addauth digest user:pwd`

### `auth:user:pwd:cdrwa`操作

```
$ create /names
$ ls /names
$ create /names revin revin
$ getAcl /names/revin
# 默认权限结果
'world,'anyone
:cdrwa

# 设置权限
$ setAcl /names/revin auth:revin:revin123:cdrwa
# 报错，因为需要一个这样的用户
Acl is not valid：/names/revin
# addauth digest revin:revin123
# 添加一个用户并登录，再次执行成功
# setAcl /names/revin auth:revin:revin123:cdrwa

$ getAcl /names/revin
# 权限结果
'digest,'revin:xxqweqweqweqweq=
:cdrwa

# 注意，当你再次授权给另外一个用户时，是无效的，只认第一次的
# setAcl /names/revin auth:hi:hi123:cdrwa
$ getAcl /names/revin
# 权限结果，不变
'digest,'revin:xxqweqweqweqweq=
:cdrwa
# 所以只认默认的revin:revin123，所以这时候也可以省略不写，匿名方式设置权限
# setAcl /names/revin auth:revin:revin123:crwa
```

### digest:user:BASE64(SHA1(pwd)):cdrwa操作

> ctrl+c 即可以退出之前所登录的revin用户就会自动退出

```
#连接zk
$ zkCli.sh -server 127.0.0.1:2181
$ ls /names
[revin]
$ create /names/test ttt
$ getAcl /names/test
# 默认权限结果
'world,'anyone
:cdrwa

# digest 需要密文的方式设置权限
$ setAcl /names/test digest:revin:xxqweqweqweqweq=:cdrwa
$ 登录用户
$ add auth digest revin:revin123
$ get /names/test
```

### `ip:192.168.1.1:[permissions]操作`

```
$ create /names/ip ip
$ getAcl /names/ip
# 默认权限结果
'world,'anyone
:cdrwa

# 设置192.168.1.7操作权限
$ setAcl /names/ip ip:192.168.1.7:cdrwa
```

### super超级管理员

super

1.修改zkServer.sh 增加super管理员

2.重启zkServer.sh

参考：[【zookeeper】ACL super 超级管理员](https://blog.csdn.net/u010900754/article/details/78498291)

```
# 连接zk,使用超级管理员登录即可操作
$ addauth digest xiaoming:xiaoming123
```

## ACL的常用使用场景

* 开发/测试环境分离，开发者无权操作测试库的节点，只能看
* 生产环境上控制指定ip的服务可以访问相关节点，防止混乱
