Redis ACL 按命令和键前缀授权怎么设计
来源:17golang原创
时间:2026-09-07 10:34:03 251浏览 收藏
Redis ACL 设计最容易犯的错,是只给用户加一条很宽的命令权限,再用一个模糊的 key 通配符兜底。更稳妥的做法是把权限拆成三层:先确定服务用户,再列出它真正需要的命令,最后用 key pattern 限制它能触碰的键。下面用一个缓存服务和一个报表读取服务组成的小项目,演示这套拆法。
一个 Redis ACL 用户能否执行成功,至少要同时满足“命令被允许”和“命令涉及的 key 命中 pattern”。生产环境优先使用专用用户和窄前缀,不要把~*、+@all当作默认配置。
+GET、+SET控制能做什么,~app:cache:*控制能碰哪些键。- 缓存写入者与报表读取者分成两个用户,避免一个账号同时拥有两类业务边界。
- 先用
ACL CAT看命令分类,再用ACL DRYRUN验收允许和拒绝场景。
Redis ACL 设计先拆成三层:用户、命令、key pattern
假设项目有两个连接身份:app_cache 负责维护 app:cache:*,需要读、写、删除和设置过期时间;report_reader 只读取 app:report:*。这两个前缀不是装饰性命名,而是权限边界的一部分。
| 对象 | 示例 | 解决的问题 |
|---|---|---|
| 用户 | app_cache | 哪个服务在使用连接 |
| 命令规则 | +GET +SET | 这个服务能执行哪些动作 |
| 键规则 | ~app:cache:* | 动作只能作用于哪些 key |

~pattern 是读写都允许的 key 模式;Redis 7.0 及更高版本还支持 %R~ 和 %W~,可以进一步拆分读写权限。为了兼容更宽的部署范围,本文先用两个用户配合 ~,不把版本差异藏在示例里。
用 ACL SETUSER 组合用户、命令和 key pattern
先创建缓存服务用户。命令中的密码只是占位符,实际部署应从密钥管理系统注入,不能把示例密码直接带到生产环境。
# 清掉旧规则,避免重复执行时残留宽权限 redis-cli ACL SETUSER app_cache reset on >replace-with-a-secret \ ~app:cache:* +get +mget +set +del +expire # 报表账号只读自己的业务前缀 redis-cli ACL SETUSER report_reader reset on >replace-with-a-secret \ ~app:report:* +get +mget +exists +ttl
reset 放在前面,是为了让这段配置具备幂等的起点;on 激活用户;+get 这类规则授予具体命令;最后的 ~... 限制 key。命令和 key 是两道门,只有其中一项匹配并不等于授权成功。
不要为了省事写成 +@all ~app:cache:*。key pattern 只约束带 key 参数的命令,像 FLUSHALL 这类面向整个数据库的命令不能靠前缀保护;如果确实使用了宽命令集合,就要显式移除危险命令。更推荐本文这种只列必要命令的配置。
用 ACL CAT 与 ACL DRYRUN 检查授权
命令分类适合做盘点,不适合替代最终的最小权限清单。先查看某个分类包含什么,再把真正需要的单个命令写进用户规则:
# 查看 read 分类当前包含哪些命令 redis-cli ACL CAT read # 验收:命令和 key 前缀都匹配时应允许 redis-cli ACL DRYRUN app_cache SET app:cache:42 value redis-cli ACL DRYRUN app_cache GET app:cache:42 # 验收:命令不在清单或 key 不匹配时应拒绝 redis-cli ACL DRYRUN app_cache CONFIG GET maxmemory redis-cli ACL DRYRUN app_cache GET other:42 redis-cli ACL DRYRUN report_reader SET app:report:42 value
把这组检查放进发布前清单,至少覆盖“正确命令 + 正确前缀”“正确命令 + 错误前缀”“错误命令 + 正确前缀”三个组合。若需要查看用户最终规则,可使用 ACL GETUSER app_cache;不要只看配置文件里最后一行,因为同一用户可以被多次追加规则。

持久化规则并接入应用
在线执行 ACL SETUSER 后,不要把它当成一次性的命令行改动。自建 Redis 可以按部署方式保存 ACL 文件,并在变更流程中记录版本;托管 Redis 则应按产品支持的权限入口管理,不能假设所有 ACL 子命令都可用。
应用连接串中明确写入用户名,连接后先做一次轻量权限探测,再开始业务请求。回滚时恢复上一版用户规则,而不是临时把用户改成 +@all ~*。如果业务新增 key 前缀,先补充命名约定和 DRYRUN 用例,再扩展权限。
最后可以用这张清单验收:用户是专用身份;命令是必要集合;key pattern 没有无意义的星号;危险的全库命令没有被宽分类带入;错误前缀和错误命令都能被拒绝;规则已有可回滚的持久化版本。
常见问题
只写 ~app:cache:*,为什么 GET 仍然失败?
key pattern 只说明允许触碰哪些键,不会自动授予命令权限。还要为用户添加 +get 或合适的命令分类。
+@read 能不能代替一长串 GET、MGET?
可以减少配置长度,但它会随分类内容扩大权限面。对单一业务账号,明确列出命令更容易审查;只有命令集合稳定且确实需要时才使用分类。
Redis 7 的 %R~ 什么时候值得用?
当同一个用户确实需要访问同一类前缀、但读写边界不同,且运行环境统一支持 Redis 7.0+ 时,可以用它细分读权限和写权限。混合版本环境先采用不同用户和普通 ~ 规则更稳妥。
参考资料
-
117 收藏
-
426 收藏
-
171 收藏
-
113 收藏
-
195 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习