# 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的服务可以访问相关节点，防止混乱


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xiaoxiami.gitbook.io/zookeeper/zookeeper-cao-zuo-ming-ling/quan-xian-acl-ming-ling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
