内容纲要
ACL GETUSER
命令详解
ACL GETUSER
命令用于获取指定 ACL 用户的详细规则,包括该用户的权限、密码、命令、键模式、频道模式和选择器等信息。这对于审计、管理和调试 Redis 用户的权限非常有帮助。
语法:
ACL GETUSER username
- username:要查询的 ACL 用户名。
主要功能:
- 返回用户的所有 ACL 规则:包括该用户的标志、密码、命令、键模式、频道模式和选择器。
- 详细权限信息:返回的权限信息反映了用户的有效权限,这可能与
ACL SETUSER
命令中配置的规则完全一致,但更侧重于用户的当前权限状态。
返回值:
- Array reply(RESP2):返回一个数组,其中包含 ACL 用户的详细规则。
- Nil reply(如果用户不存在):如果指定的用户名不存在,返回
nil
。 - Map reply(RESP3):在 RESP3 协议下,返回一个包含 ACL 用户详细规则的映射。
返回的数据包括:
- flags:用户的标志(例如
on
,nopass
,allkeys
等)。 - passwords:用户的密码哈希(如果配置了密码)。
- commands:用户可以执行的命令规则(例如
+GET
,+SET
等)。 - keys:用户允许访问的键模式。
- channels:用户允许访问的频道模式(从版本 6.2 起支持)。
- selectors:用户的选择器(从版本 7.0 起支持)。
时间复杂度:
- O(N):其中
N
是用户拥有的密码、命令和模式规则的数量。查询时间与用户规则的数量成正比。
ACL 分类:
- 该命令属于
@admin
、@slow
和@dangerous
分类。
示例:
-
查询一个用户的 ACL 配置
假设你已经配置了一个名为sample
的用户,并为其指定了特定的 ACL 规则:ACL SETUSER sample on nopass +GET allkeys &* (+SET ~key2)
然后,你可以使用
ACL GETUSER
命令查看该用户的所有规则:ACL GETUSER sample
返回结果:
1) "flags" 2) 1) "on" 2) "allkeys" 3) "nopass" 3) "passwords" 4) (empty array) 5) "commands" 6) "+@all" 7) "keys" 8) "~*" 9) "channels" 10) "&*" 11) "selectors" 12) 1) 1) "commands" 6) "+SET" 7) "keys" 8) "~key2" 9) "channels" 10) "&*"
解释:
- flags:该用户处于
on
状态,并且没有密码(nopass
),能够访问所有键(allkeys
)。 - passwords:该用户没有配置密码,因此该字段为空。
- commands:该用户可以执行
+@all
(所有命令)和+SET
命令。 - keys:该用户可以访问以
~*
匹配的所有键。 - channels:该用户可以订阅以
&*
匹配的所有频道。 - selectors:该用户具有一个选择器,允许执行
+SET
命令,并访问与~key2
匹配的键和&*
匹配的频道。
- flags:该用户处于
-
用户不存在的情况
如果查询的用户不存在,则返回nil
(RESP2)或null
(RESP3)。ACL GETUSER non_existing_user
返回结果:
nil
或者在 RESP3 协议下:
null
版本历史:
- 6.2.0:增加了 Pub/Sub 频道模式。
- 7.0.0:增加了选择器,并改变了键模式和频道模式的返回格式,将其从数组改为规则表示形式。
总结
ACL GETUSER
是一个非常有用的命令,可以帮助你查看指定用户的 ACL 配置及权限状态。通过该命令,你可以轻松地审计 Redis 用户的权限,查看他们被授予的命令、键模式、频道模式等规则。它可以帮助你确保 Redis 实例的安全性,避免不必要的权限暴露或错误配置。