ACL SETUSER
创建、修改ACL用户及其规则。
语法
ACL SETUSER username [rule [rule ...]]
引入版本:6.0.0
复杂度摘要:O(N)
创建具有指定规则的ACL 用户或修改现有用户的规则。
交互操作Redis ACL用户。如果用户名不存在,该命令将创建没有任何权限的用户名。然后,它从左到右读取作为连续参数提供的所有 规则,并按指定设置用户 ACL 规则。如果用户已经存在,则提供的 ACL 规则将简单地将 另外 应用于已设置的规则。例如:
ACL SETUSER virginia on allkeys +set
上述命令创建一个名为 virginia 的用户,该用户处于活动状态(on 规则),可以访问任何键(全键 规则),并且可以调用设置命令(+设置 规则)。然后,您可以使用另一个 ACL SETUSER 调用来修改用户规则:
ACL SETUSER virginia +get
上述规则将新规则应用于用户 virginia,因此除了 SET 之外,用户 virginia 现在还可以使用 GET 命令。
从Redis 7.0开始,ACL规则也可以分为多个不同的规则集,称为选择器。通过将规则括在括号中并像任何其他规则一样提供它们来添加选择器。为了执行命令,根权限(在括号外定义的规则)或任何选择器(在括号内定义的规则)必须与给定的命令匹配。例如:
ACL SETUSER virginia on +GET allkeys (+SET ~app1*)
这为用户设置了两组权限,一组是针对用户定义的,另一组是使用选择器定义的。 root用户权限只允许执行get命令,但可以在任意键上执行。然后,选择器授予第二组权限:访问要在以 app1 开头的任何键上执行的 SET 命令。使用多个选择器允许您授予不同的权限,具体取决于正在访问的键。
当我们想要确保从头开始定义一个用户,而不关心它是否有先前定义的关联规则时,我们可以使用特殊规则 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 系统的一般工作方式。
必需参数
username
用户创建或修改。
可选参数
rule [rule ...]
应用于用户的一个或多个 ACL 规则。请参阅 ACL规则 部分以获取完整的规则列表。
示例
> ACL SETUSER alan allkeys +@string +@set -SADD >alanpassword
+OK
> ACL SETUSER antirez heeyyyy
(error) ERR Error in ACL SETUSER modifier 'heeyyyy': Syntax error
详细说明
ACL规则
Redis ACL 规则分为两类:定义命令权限或 命令规则 的规则,以及定义用户状态或 用户管理规则 的规则。这是所有支持的 Redis ACL 规则的列表:
命令规则
~<pattern>:将指定的键模式(全局样式模式,如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:将用户设置为未激活,将无法以此用户身份登录。请注意,如果用户在连接已通过身份验证后被禁用(设置为关闭),则连接将继续按预期工作。要同时终止旧连接,您可以将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:删除用户的任何能力。它们被设置为关闭,没有密码,无法执行任何命令,无法访问任何键。
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ❌ 标准 |
❌ 标准 |
返回值
RESP2
简单字符串回复:OK。如果规则包含错误,则返回错误。
RESP3
简单字符串回复:OK。如果规则包含错误,则返回错误。
资料来源:Redis 官方 ACL SETUSER 文档;中文内容参考 Redis 文档许可。