ACL SETUSER

语法
ACL SETUSER username [rule [rule ...]]
可用时间
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 命令,但可以在任何键上执行。然后,选择器授予第二组权限:访问以 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 系统的工作原理。

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),则连接将继续按预期工作。要同时终止旧连接,您可以使用 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: 从用户中删除任何功能。它们被设置为 off,没有密码,无法执行任何命令,也无法访问任何键。

示例

> 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 版本开始:添加了选择器和基于键的权限。
RATE THIS PAGE
Back to top ↑