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 版本开始:添加了选择器和基于键的权限。
评价此页面
回到顶部 ↑