ACL SETUSER
ACL SETUSER username [rule [rule ...]]
- 可用版本
- Redis 开源版 6.0.0
- 时间复杂度
- O(N)。其中 N 是提供的规则数量。
- ACL 类别
-
@admin
,@slow
,@dangerous
,
创建具有指定规则的 ACL 用户,或修改现有用户的规则。
交互式地操作 Redis ACL 用户。如果用户名不存在,该命令会创建该用户名,但没有任何权限。然后它从左到右读取作为连续参数提供的所有规则,并按指定设置用户 ACL 规则。如果用户已经存在,则提供的 ACL 规则会简单地在已设置的规则基础上*附加*应用。例如
ACL SETUSER virginia on allkeys +set
上述命令创建一个名为 virginia
的用户,该用户处于活动状态(*on* 规则),可以访问任何键(*allkeys* 规则),并且可以调用 set 命令(*+set* 规则)。然后,您可以使用另一个 ACL SETUSER
调用来修改用户规则
ACL SETUSER virginia +get
上述规则将新规则应用到用户 virginia
,因此除了SET
命令外,用户 virginia
现在也可以使用 GET
命令。
从 Redis 7.0 开始,ACL 规则也可以分组为多个不同的规则集,称为*选择器*。选择器通过将规则用括号括起来并像其他任何规则一样提供来添加。为了执行命令,根权限(括号外定义的规则)或任何选择器(括号内定义的规则)都必须与给定命令匹配。例如
ACL SETUSER virginia on +GET allkeys (+SET ~app1*)
这为用户设置了两组权限,一组定义在用户上,另一组通过选择器定义。根用户权限只允许执行 get 命令,但可以在任何键上执行。选择器随后授予辅助权限集:允许执行 SET
命令,对任何以 app1
开头的键操作。使用多个选择器可以根据访问的键授予不同的权限。
当我们想确保从头开始定义一个用户,而不关心它是否之前定义过相关规则时,我们可以使用特殊规则 reset
作为第一个规则,以便清除所有其他现有规则
ACL SETUSER antirez reset [... other rules ...]
重置用户后,其 ACL 规则将恢复到默认状态:非活动,无密码,不能执行任何命令,也不能访问任何键或频道
> ACL SETUSER antirez reset
+OK
> ACL LIST
1) "user antirez off -@all"
ACL 规则可以是“on”、“off”、“reset”、“allkeys”等单词,或者是以特殊字符开头并后跟另一个字符串(中间没有空格)的特殊规则,例如“+SET”。
有关持久化 ACL 的信息,请参阅ACL 教程。
以下文档是关于此命令功能的参考手册,但我们的ACL 教程可能更能循序渐进地介绍 ACL 系统的工作原理。
ACL 规则
Redis ACL 规则分为两类:定义命令权限的规则或*命令规则*,以及定义用户状态的规则或*用户管理规则*。这是所有支持的 Redis ACL 规则的列表
命令规则
~<pattern>
:将指定的键模式(glob 风格模式,如KEYS
命令中使用的)添加到用户可访问的键模式列表中。这会授予与模式匹配的键的读写权限。您可以为同一个用户添加多个键模式。示例:~objects:*
%R~<pattern>
:(Redis 7.0 及更高版本可用)添加指定的读键模式。这与常规键模式的行为类似,但仅授予读取与给定模式匹配的键的权限。有关更多信息,请参阅键权限。%W~<pattern>
:(Redis 7.0 及更高版本可用)添加指定的写键模式。这与常规键模式的行为类似,但仅授予写入与给定模式匹配的键的权限。有关更多信息,请参阅键权限。%RW~<pattern>
:(Redis 7.0 及更高版本可用)~<pattern>
的别名。allkeys
:~*
的别名,允许用户访问所有键。resetkeys
:从用户可访问的键模式列表中移除所有键模式。&<pattern>
:(Redis 6.2 及更高版本可用)将指定的 glob 风格模式添加到用户可访问的 Pub/Sub 频道模式列表中。您可以为同一个用户添加多个频道模式。示例:&chatroom:*
allchannels
:&*
的别名,允许用户访问所有 Pub/Sub 频道。resetchannels
:从用户可访问的 Pub/Sub 频道模式列表中移除所有频道模式。+<command>
:将命令添加到用户可以调用的命令列表中。可与|
一起使用以允许子命令(例如 "+config|get")。+@<category>
:将指定类别中的所有命令添加到用户可以执行的命令列表中。示例:+@string
(添加所有字符串命令)。有关类别列表,请查看ACL CAT
命令。+<command>|first-arg
:允许使用通常被禁用的命令的特定第一个参数。此功能仅支持没有子命令的命令,并且不允许使用负形式,例如 -SELECT|1,只能使用以“+”开头的加法形式。此功能已弃用,未来可能会移除。allcommands
:+@all
的别名。添加服务器中所有命令,包括通过模块加载的*未来命令*,供此用户执行。-<command>
:从用户可以调用的命令列表中移除该命令。从 Redis 7.0 开始,可与|
一起使用以阻止子命令(例如,“-config|set”)。-@<category>
:与+@<category>
类似,但移除类别中的所有命令,而不是添加它们。nocommands
:-@all
的别名。移除所有命令,用户将无法执行任何操作。
用户管理规则
on
:将用户设置为活动状态,可以使用AUTH <username> <password>
进行身份验证。off
:将用户设置为非活动状态,将无法以该用户身份登录。请注意,如果某个用户已被禁用(设置为 off),而在此之前已有连接使用该用户进行了身份验证,则这些连接将继续正常工作。要同时终止旧连接,可以使用带有 user 选项的CLIENT KILL
命令。另一种方法是使用ACL DELUSER
删除用户,这将导致所有已验证为该已删除用户的连接断开。nopass
:将用户设置为*无密码*用户。这意味着可以使用任何密码对该用户进行身份验证。默认情况下,特殊用户default
设置为“nopass”。nopass
规则还会重置用户所有已配置的密码。>password
:将指定的明文密码作为哈希密码添加到用户密码列表中。每个用户可以有多个活动密码,以便简化密码轮换。指定的密码不会以明文形式存储在服务器中。示例:>mypassword
。#<hashedpassword>
:将指定的哈希密码添加到用户密码列表中。Redis 哈希密码使用 SHA256 进行哈希处理,并转换为十六进制字符串。示例:#c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
。<password
:与>password
类似,但移除密码而不是添加它。!<hashedpassword>
:与#<hashedpassword>
类似,但移除密码而不是添加它。(<rule list>)
:(Redis 7.0 及更高版本可用)创建一个新的选择器来匹配规则。选择器在用户权限之后评估,并按照定义的顺序评估。如果命令与用户权限或任何选择器匹配,则允许执行。有关更多信息,请参阅选择器。clearselectors
:(Redis 7.0 及更高版本可用)删除附加到用户的所有选择器。reset
:移除用户的任何能力。用户被设置为非活动状态,无密码,无法执行任何命令,无法访问任何键。
示例
> ACL SETUSER alan allkeys +@string +@set -SADD >alanpassword
+OK
> ACL SETUSER antirez heeyyyy
(error) ERR Error in ACL SETUSER modifier 'heeyyyy': Syntax error
RESP2/RESP3 回复
简单字符串回复:OK
。如果规则包含错误,则返回错误。历史
- 从 Redis 6.2.0 版本开始:添加了 Pub/Sub 频道模式。
- 从 Redis 7.0.0 版本开始:添加了选择器和基于键的权限。