ACL SETUSER

用法
ACL SETUSER username [ rule ] [ [ rule ] ... ]
复杂度
O(N)。其中 N 是提供的规则数量。
6.0.0
ACL 类别
@admin, @dangerous, @slow

使用指定规则创建 ACL 用户或修改现有用户的规则。

交互式地操作 Valkey ACL 用户。如果用户名不存在,该命令将创建该用户名,但没有任何权限。然后,它从左到右读取作为后续参数提供的所有规则,按指定设置用户 ACL 规则。如果用户已存在,提供的 ACL 规则将在已设置的规则基础上额外应用。例如

ACL SETUSER virginia on allkeys +set

上述命令创建了一个名为 virginia 的用户,该用户处于活动状态(`on` 规则),可以访问任何键(`allkeys` 规则),并且可以调用 `set` 命令(`+set` 规则)。然后,您可以使用另一个 ACL SETUSER 调用来修改用户规则

ACL SETUSER virginia +get

上述规则将新规则应用于用户 virginia,因此除了 SET 之外,用户 virginia 现在还可以使用 GET 命令。

ACL 规则也可以分组为多个不同的规则集,称为选择器。通过将规则括在括号中并像任何其他规则一样提供它们来添加选择器。为了执行命令,根权限(在括号外定义的规则)或任何选择器(在括号内定义的规则)必须与给定命令匹配。例如

ACL SETUSER virginia on +GET allkeys (+SET ~app1*)

这会设置一个具有两组权限的用户,一组定义在用户上,另一组定义在选择器中。根用户权限只允许执行 `get` 命令,但可以在任何键上执行。选择器然后授予第二组权限:访问 `SET` 命令,该命令可在任何以 `app1` 开头的键上执行。使用多个选择器允许您根据正在访问的键授予不同的权限。

当我们想确保从头开始定义一个用户,而不关心它之前是否定义过相关规则时,我们可以使用特殊规则 reset 作为第一条规则,以清除所有其他现有规则

ACL SETUSER antirez reset [... other rules ...]

重置用户后,其 ACL 规则将恢复为默认值:非活动、无密码、不能执行任何命令,也不能访问任何键或通道

127.0.0.1:6379> ACL SETUSER antirez reset
OK
127.0.0.1:6379> ACL LIST
1) "user antirez off -@all"

ACL 规则要么是“on”、“off”、“reset”、“allkeys”这样的单词,要么是以特殊字符开头,后跟另一个字符串(中间没有空格)的特殊规则,例如“+SET”。

以下文档是关于此命令功能的参考手册,但我们的ACL 教程可能是对 ACL 系统总体工作原理的更温和的介绍。

ACL 规则

Valkey ACL 规则分为两类:定义命令权限的规则或命令规则,以及定义用户状态的规则或用户管理规则。这是所有支持的 Valkey ACL 规则列表

命令规则

  • ~<pattern>:将指定的键模式(glob 风格模式,如 `KEYS` 命令中所示)添加到用户可访问的键模式列表中。这会授予与模式匹配的键的读写权限。您可以为同一个用户添加多个键模式。示例:~objects:*
  • %R~<pattern>:添加指定的读键模式。这与常规键模式的行为类似,但只授予从与给定模式匹配的键读取的权限。有关更多信息,请参阅键权限
  • %W~<pattern>:添加指定的写键模式。这与常规键模式的行为类似,但只授予向与给定模式匹配的键写入的权限。有关更多信息,请参阅键权限
  • %RW~<pattern>~<pattern> 的别名。
  • allkeys~* 的别名,它允许用户访问所有键。
  • resetkeys:从用户可以访问的键模式列表中移除所有键模式。
  • &<pattern>:将指定的 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>:从用户可以调用的命令列表中移除命令。它可以与 `|` 一起使用以阻止子命令(例如,“-config|set”)。
  • -@<category>:与 +@<category> 类似,但移除类别中的所有命令而不是添加它们。
  • nocommands-@all 的别名。移除所有命令,用户将无法执行任何操作。

用户管理规则

  • on:将用户设置为活动状态,将可以使用 AUTH <username> <password> 对此用户进行身份验证。
  • off:将用户设置为非活动状态,将无法以此用户身份登录。请注意,如果用户在已有连接以此用户身份通过身份验证后被禁用(设置为 off),则这些连接将继续按预期工作。要终止旧连接,可以使用带有用户选项的 CLIENT KILL。另一种方法是使用 ACL DELUSER 删除用户,这将导致所有以此已删除用户身份进行身份验证的连接断开。
  • nopass:用户被设置为无密码用户。这意味着可以使用任何密码对此类用户进行身份验证。默认情况下,default 特殊用户设置为“nopass”。nopass 规则还将重置用户所有已配置的密码。
  • >password:将指定的明文密码作为哈希密码添加到用户密码列表中。每个用户可以有多个活动密码,以便简化密码轮换。指定的密码不会以明文形式存储在服务器内部。示例:>mypassword
  • #<hashedpassword>:将指定的哈希密码添加到用户密码列表中。哈希密码使用 SHA256 进行哈希并转换为十六进制字符串。示例:#c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
  • <password:与 >password 类似,但移除密码而不是添加密码。
  • !<hashedpassword>:与 #<hashedpassword> 类似,但移除密码而不是添加密码。
  • (<rule list>):创建一个新的选择器来匹配规则。选择器在用户权限之后进行评估,并根据它们定义的顺序进行评估。如果命令匹配用户权限或任何选择器,则允许执行。有关更多信息,请参阅选择器
  • clearselectors:删除附加到用户的所有选择器。
  • reset:从用户中移除任何能力。它们被设置为非活动状态,无密码,无法执行任何命令,无法访问任何键。

示例

127.0.0.1:6379> ACL SETUSER alan allkeys +@string +@set -SADD >alanpassword
OK
127.0.0.1:6379> ACL SETUSER antirez heeyyyy
(error) ERR Error in ACL SETUSER modifier 'heeyyyy': Syntax error

RESP2/RESP3 回复

简单字符串回复OK

如果规则包含错误,则返回错误。

历史

版本 变更
6.2.0

添加了 Pub/Sub 通道模式。

7.0.0

添加了选择器和基于键的权限。