Redis ACL 按命令和 key pattern 限制权限怎么写
来源:17golang原创
时间:2026-09-11 15:21:11 207浏览 收藏
Redis ACL 不是只给用户设置一个密码。真正要收敛权限,至少要同时写清楚“谁能登录”“能执行哪些命令”“这些命令能碰哪些 key”。最小可用的思路是先 reset 清掉旧规则,再按应用职责加入命令和 key pattern;Redis 7 及以上还可以用 %R~、%W~ 把读写范围拆开。
+GET只限制命令,不代表用户能访问任何 key;还要配置~app:*或更细的 key 权限。~pattern默认同时授予读写,Redis 7 可用%R~pattern和%W~pattern区分读写。- key pattern 管不到不带 key 参数的命令,
FLUSHALL、FLUSHDB、SWAPDB要单独移除。
先把三种权限拆开:用户、命令与 key pattern
ACL 规则是按从左到右应用的,已有用户如果直接追加规则,历史权限仍可能留下来。因此应用用户建议从 reset 开始。下面这个最小示例让 app_reader 只读 app:*,并保留认证密码由部署系统替换。
# reset 清除用户旧规则,避免历史 +@all 或 ~* 继续生效 redis-cli ACL SETUSER app_reader reset on '>replace-with-strong-password' '~app:*' +GET +MGET +EXISTS # 查看最终规则,确认用户、命令和 key 范围都在预期内 redis-cli ACL GETUSER app_reader
这里的 +GET 与 +MGET 是命令边界,~app:* 是 key 边界。只写命令不写 key pattern,客户端仍会因为没有匹配的 key 权限而失败;只写 ~app:* 也不会自动获得 GET 或 SET。

用 selector 处理读写边界,别把 ~* 当成万能限制
如果同一个用户既要读取缓存,又要写入自己的业务 key,直接使用 ~app:* 会把读写合并。Redis 7 的 key permission 可以把两种能力拆开;selector 用括号包住一组规则,适合表达“某组命令只能作用于某组 key”。
# Redis 7+:读 selector 和写 selector 分别绑定到同一组 key redis-cli ACL SETUSER app_rw reset on '>replace-with-strong-password' '(+@read %R~app:*)' '(+@write %W~app:*)' # ACL CAT 可查看 read、write 等命令分类的实际成员 redis-cli ACL CAT read redis-cli ACL CAT write
不要把 selector 理解成拒绝规则。根权限或任意一个 selector 匹配成功,就可能放行命令;所以根权限里不要残留 +@all、allkeys 这类宽规则。多 key 命令还要检查每个 key 是否同时满足命令所需的读写权限。
| 写法 | 含义 | 适用提醒 |
|---|---|---|
~app:* | 匹配 key 的读写权限 | 最简单,但范围较宽 |
%R~app:* | 只允许读取匹配 key | Redis 7 及以上 |
%W~app:* | 只允许写入匹配 key | Redis 7 及以上 |
resetkeys | 清除当前 key pattern | 修改用户时防止旧范围残留 |

key pattern 管不到的命令要单独封口
key pattern 只约束命令参数中明确出现的 key。它不会限制操作整个数据库或整个 keyspace 的命令,所以“只允许 tenant1:*”并不等于“只能删除 tenant1 数据”。一个带宽权限的用户仍可能执行清空数据库的命令。
# 即使保留较宽的命令类别,也要显式移除清空和交换数据库的命令 redis-cli ACL SETUSER tenant_app reset on '>replace-with-strong-password' '~tenant1:*' +@all -FLUSHALL -FLUSHDB -SWAPDB # 修改后再次读取规则,确认危险命令确实出现在减号列表中 redis-cli ACL GETUSER tenant_app
生产环境还应把 CONFIG、MODULE、ACL 等管理能力按职责拆给平台账号,不要为了让业务请求通过而直接使用 +@all。如果客户端收到 NOPERM,先记录用户名、命令名和实际 key,再分别对照命令规则与 key 规则,不要先扩大到 ~*。
发布前的 ACL 检查清单
- 用
ACL GETUSER 用户名确认用户是on,没有遗留nopass、allkeys或+@all。 - 至少验证一条允许的 key、一条不匹配的 key,以及一条不应出现的命令。
- 涉及 Redis 7 读写权限时,确认服务端版本和客户端对 selector 语法的支持。
- 变更后保存 ACL 配置并安排密码轮换;不要把示例密码直接用于生产。
常见问题
只配置 +GET,为什么还是 NOPERM?
因为命令权限和 key 权限是两层条件。还需要为目标 key 配置匹配的 ~pattern 或读权限 pattern。
~app:* 能阻止 FLUSHALL 吗?
不能。FLUSHALL 没有具体 key 参数,必须使用 -FLUSHALL 单独移除,FLUSHDB 和 SWAPDB 同理。
修改 ACL SETUSER 会覆盖旧配置吗?
普通规则默认是在原有规则上追加或修改;要从干净状态重建,先把 reset 放在规则开头。
-
117 收藏
-
426 收藏
-
171 收藏
-
113 收藏
-
195 收藏
-
372 收藏
-
数据库 · Redis | 3小时前 | 内存 · Redis · 缓存 · LRU · ttl · redis maxmemory-policy allkeys-lru 内存淘汰 volatile-ttl288 收藏
-
412 收藏
-
数据库 · Redis | 5小时前 | Redis · 数据一致性 · HyperLogLog · 数据统计 · 计费系统 · redis hyperloglog PFADD PFCOUNT PFMERGE 精确计费156 收藏
-
311 收藏
-
287 收藏
-
数据库 · Redis | 1天前 | Redis · 消息队列 · Stream · 消费组 · XREADGROUP XACK XPENDING XAUTOCLAIM Redis Streams Pending List342 收藏
-
349 收藏
-
456 收藏
-
387 收藏
-
478 收藏
-
205 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习