ACL 设置用户

Syntax
ACL SETUSER username [rule [rule ...]]
Available since:
6.0.0
Time complexity:
O(N). Where N is the number of rules provided.
ACL categories:
@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规则列表:

命令规则

  • ~: 将指定的键模式(通配符样式模式,如KEYS命令中的模式)添加到用户可访问的键模式列表中。这将授予用户对匹配该模式的键的读写权限。您可以为同一用户添加多个键模式。示例:~objects:*
  • %R~: (适用于 Redis 7.0 及更高版本) 添加指定的读取键模式。此行为类似于常规键模式,但仅授予从匹配给定模式的键中读取的权限。有关更多信息,请参阅键权限
  • %W~: (在 Redis 7.0 及更高版本中可用)添加指定的写键模式。这与常规键模式类似,但仅授予对匹配给定模式的键的写权限。有关更多信息,请参阅键权限
  • %RW~: (在 Redis 7.0 及更高版本中可用) ~ 的别名。
  • allkeys: ~* 的别名,它允许用户访问所有键。
  • resetkeys: 从用户可以访问的键模式列表中移除所有键模式。
  • &: (适用于 Redis 6.2 及更高版本) 将指定的全局样式模式添加到用户可访问的 Pub/Sub 频道模式列表中。您可以为同一用户添加多个频道模式。示例: &chatroom:*
  • allchannels: &* 的别名,它允许用户访问所有的 Pub/Sub 频道。
  • resetchannels: 从用户可以访问的Pub/Sub频道模式列表中移除所有频道模式。
  • +: 将命令添加到用户可以调用的命令列表中。可以与 | 一起使用以允许子命令(例如 "+config|get")。
  • +@: 将指定类别中的所有命令添加到用户可以执行的命令列表中。例如:+@string(添加所有字符串命令)。有关类别列表,请查看ACL CAT命令。
  • +|first-arg: 允许一个被禁用的命令使用特定的第一个参数。它仅支持没有子命令的命令,并且不允许像 -SELECT|1 这样的否定形式,只能以 "+" 开头。此功能已被弃用,未来可能会被移除。
  • allcommands: +@all 的别名。添加服务器中所有命令,包括通过模块加载的未来命令,以供此用户执行。
  • -: 从用户可以调用的命令列表中移除该命令。从 Redis 7.0 开始,它可以与 | 一起用于阻塞子命令(例如,"-config|set")。
  • -@: 类似于 +@,但是会移除该类别中的所有命令,而不是添加它们。
  • nocommands: -@all 的别名。移除所有命令,用户将无法执行任何操作。

用户管理规则

  • on: 将用户设置为活跃状态,可以使用AUTH 作为该用户进行身份验证。
  • off: 将用户设置为非活动状态,该用户将无法登录。请注意,如果用户在已经通过该用户认证的连接之后被禁用(设置为off),这些连接将继续正常工作。要终止旧连接,您可以使用CLIENT KILL并指定用户选项。另一种方法是使用ACL DELUSER删除用户,这将导致所有以该用户身份认证的连接被断开。
  • nopass: 用户被设置为无密码用户。这意味着可以使用任何密码进行身份验证。默认情况下,default特殊用户被设置为"nopass"。nopass规则还将重置用户所有配置的密码。
  • >password: 将指定的明文密码作为哈希密码添加到用户密码列表中。每个用户可以拥有多个活动密码,以便密码轮换更加简单。指定的密码不会以明文形式存储在服务器中。示例:>mypassword
  • #: 将指定的哈希密码添加到用户密码列表中。Redis 哈希密码使用 SHA256 进行哈希处理,并转换为十六进制字符串。示例:#c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
  • : 类似于 >password,但会移除密码而不是添加它。
  • !: 类似于 #,但会移除密码而不是添加它。
  • (): (在 Redis 7.0 及更高版本中可用)创建一个新的选择器以匹配规则。选择器在用户权限之后进行评估,并根据它们定义的顺序进行评估。如果命令匹配用户权限或任何选择器,则允许执行。有关更多信息,请参见selectors
  • 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 回复

Simple string reply: OK. If the rules contain errors, the error is returned.

历史

  • 从 Redis 6.2.0 版本开始:添加了 Pub/Sub 通道模式。
  • 从 Redis 7.0.0 版本开始:增加了选择器和基于键的权限。
RATE THIS PAGE
Back to top ↑