由于redis的ACL内容较多,故一共分为三篇博客
redis用户权限管理 - ACL详解第一篇_YZF_Kevin的博客-CSDN博客
redis用户权限管理 - ACL详解第二篇_YZF_Kevin的博客-CSDN博客
redis用户权限管理 - ACL详解第三篇_YZF_Kevin的博客-CSDN博客
上一篇博客 redis用户权限管理 - ACL详解第二篇_YZF_Kevin的博客-CSDN博客
主要讲了redis中ACL对命令的分类,增删命令集合的权限,增删子命令的权限,设置key的范围等
这边博客开始,我们开始讲解ACL持久化和加载相关,以及其他一些杂项命令。各位一定要知道,如果像上两篇博客中那样,只是在redis终端设置ACL相关权限,那这些设置都是保存在redis内存中,一旦redis重启,这些设置就会全部失效,要想持久化必须保存成文件,redis的ACL已经为我们提供了这些功能
1. 把ACL相关设置保存到文件
2. 从配置文件中读取ACL相关设置
3. ACL生成密码
4. ACL测试能否使用指定命令
如果想持久化保存ACL配置,也就是把ACL相关权限设置都保存到文件中,分为两个步骤
1. 在redis配置文件中设置要导出的ACL配置文件全路径名,我这里是设置到了redis的bin目录,文件名是users.acl,注意ACL的配置文件名必须以.acl结尾
2. 在redis终端上运行命令 ACL SAVE 命令即可,操作如下
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
127.0.0.1:6379>
127.0.0.1:6379> ACL SETUSER user1 on >123456
OK
127.0.0.1:6379> ACL SETUSER user1 (~* +get) (~testset:* +set)
OK
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user user1 on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 resetchannels -@all (~* resetchannels -@all +get) (~testset:* resetchannels -@all +set)"127.0.0.1:6379> ACL SAVE
OK
第一个命令,ACL LIST 查看权限,只有一个默认的default用户
第二个命令,ACL SETUSER user1 on >123456 用来新建一个用户user1,密码是123456
第三个命令,ACL SETUSER user1 (~* +get) (~testset:* +set) 给用户user1设置权限,权限1是对所有的key有get权限,权限2是对所有以testset:开头的key有set权限
第四个命令,ACL LIST 再次查看权限,现在已经有了用户user1的权限详情了
第五个命令,ACL SAVE 把所有的ACL权限保存到配置文件中,即redis.conf中配置的aclfile配置项
现在我们查看aclfile文件,如下图,可以看到users.acl文件中的内容和ACL LIST的结果完全一致
root@ubuntu:/usr/local/redis/redis-7.0.0/bin# cat users.acl
user default on nopass ~* &* +@all
user user1 on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 resetchannels -@all (~* resetchannels -@all +get) (~testset:* resetchannels -@all +set)
root@ubuntu:/usr/local/redis/redis-7.0.0/bin#
如果已经有了acl配置文件,想直接加载到redis中生效,也很简单,首先在redis配置文件中设置ACL配置文件全路径名,然后在redis终端上运行命令 ACL LOAD 命令即可
我们接着第一步的操作,先删除刚才添加的用户user1,再次从ACL配置文件中加载,如下
127.0.0.1:6379> ACL DELUSER user1
(integer) 1
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
127.0.0.1:6379> ACL LOAD
OK
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user user1 on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 resetchannels -@all (~* resetchannels -@all +get) (~testset:* resetchannels -@all +set)"
第一个命令,ACL DELUSER user1 删除刚才添加的用户user1
第二个命令,ACL LIST 查看权限,可以看到现在只剩下默认的default用户了
第三个命令,ACL LOAD 从redis配置文件的aclfile配置项指定的文件中加载ACL权限相关
第四个命令,ACL LIST 再次查看权限,可以看到现在已经有了用户user1的权限详情了,和users.acl文件中内容一致
给redis用户设置密码时,为了方便我们,ACL提供了自动生成密码的命令
格式:ACL GENPASS 选填位数
127.0.0.1:6379> ACL GENPASS
"6cabfacab48f7a5d4c6627210acc1c6fc2312af1ae0a06f3241f2cbe8b8e223b"
127.0.0.1:6379>
127.0.0.1:6379> ACL GENPASS 128
"2a770f6487e8d4e764fd4bc1c4de5a92"
127.0.0.1:6379>
127.0.0.1:6379> ACL GENPASS 32
"9bde31d4"
127.0.0.1:6379>
第一个命令,ACL GENPASS 不填位数就默认产生256位也就是32字节的伪随机字符串,并转换为64字节长度的字符串,数字加字母
第二个命令,ACL GENPASS 128 产生128位的字符串,最终长度32字节
第二个命令,ACL GENPASS 32 产生32位的字符串,最终长度8字节
如果redis用户对自己能否使用某个命令不清楚,可以进行查询
格式:ACL DRYRUN 用户名 命令 参数
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user user1 on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 resetchannels -@all (~* resetchannels -@all +get) (~testset:* resetchannels -@all +set)"
127.0.0.1:6379>
127.0.0.1:6379> ACL DRYRUN user1 get name
OK
127.0.0.1:6379> ACL DRYRUN user1 set name 123
"This user has no permissions to access the 'name' key"
127.0.0.1:6379> ACL DRYRUN user1 set testset:1 123
OK
第一个命令,ACL LIST 查看权限,可以看到用户user1的权限有两个,1:对所有的key拥有get权限,2:对以testset:*开头的key拥有set权限
第二个命令,ACL DRYRUN user1 get name 查询用户user1能否运行 get name 命令,返回成功
第三个命令,ACL DRYRUN user1 set name 123 查询用户user1能否运行 set name 123 命令,返回失败,因为其只有对以 testset: 开头的key有set权限
第四个命令,ACL DRYRUN user1 set testset:1 123 查询用户user1能否运行set testset:1 123 命令,返回成功