ACL 设置用户
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命令。+: 允许一个被禁用的命令使用特定的第一个参数。它仅支持没有子命令的命令,并且不允许像 -SELECT|1 这样的否定形式,只能以 "+" 开头。此功能已被弃用,未来可能会被移除。|first-arg 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 版本开始:增加了选择器和基于键的权限。