ACL SETUSER
ACL SETUSER username [rule [rule ...]]
- 从以下位置开始可用:
- 6.0.0
- 时间复杂度:
- O(N) 的 S Package。其中 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 规则还可以分组为多组不同的规则,称为选择器。 选择器的添加方式是将规则括在括号中,并像任何其他规则一样提供它们。 要执行命令,root 权限(在括号外定义的规则)或任何选择器(在括号内定义的规则)必须与给定的命令匹配。 例如:
ACL SETUSER virginia on +GET allkeys (+SET ~app1*)
这将为用户设置两组权限,一组在用户上定义,另一组使用选择器定义。
root 用户权限只允许执行 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
.添加服务器中的所有命令,包括通过 module 加载的未来命令,由此用户执行。-<command>
:将命令删除到用户可以调用的命令列表中。从 Redis 7.0 开始,它可以与|
用于阻止子命令(例如,“-config|set”)。-@<category>
:喜欢+@<category>
但会删除类别中的所有命令,而不是添加它们。nocommands
:别名-@all
.删除所有命令,用户将无法再执行任何作。
用户管理规则
on
:将用户设置为活动状态,即可使用AUTH <username> <password>
.off
:将用户设置为非活动状态,将无法以此用户身份登录。请注意,如果用户在已通过该用户的连接身份验证后被禁用(设置为关闭),则连接将继续按预期工作。要同时终止旧连接,您可以使用CLIENT KILL
替换为 User 选项。另一种方法是使用ACL DELUSER
,这将导致所有以已删除用户身份进行身份验证的连接都断开连接。nopass
:用户被设置为无密码用户。这意味着可以使用任何密码以此类用户的身份进行身份验证。默认情况下,default
特殊用户设置为 “nopass”。这nopass
rule 还将重置用户的所有已配置密码。>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 开始:添加了选择器和基于键的权限。