Redis ACL 按命令和 key pattern 限制权限怎么写
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 放在规则开头。
Go http.Request Body 读过一次后为什么下游拿不到
- 上一篇
- Go http.Request Body 读过一次后为什么下游拿不到
- 下一篇
- Go compress/gzip Header.Name 如何影响生成文件元信息
-
- 数据库 · Redis | 1小时前 |
- Redis Cluster 多 key 命令为什么要求 hash tag
- 372浏览 收藏
-
- 数据库 · Redis | 2小时前 | 内存 · Redis · 缓存 · LRU · ttl · redis maxmemory-policy allkeys-lru 内存淘汰 volatile-ttl
- Redis maxmemory-policy 选 allkeys-lru 还是 volatile-ttl
- 288浏览 收藏
-
- 数据库 · Redis | 4小时前 |
- Redis GEOSEARCH 按距离过滤时单位怎么选择
- 412浏览 收藏
-
- 数据库 · Redis | 5小时前 | Redis · 数据一致性 · HyperLogLog · 数据统计 · 计费系统 · redis hyperloglog PFADD PFCOUNT PFMERGE 精确计费
- Redis HyperLogLog 误差为什么不适合精确计费
- 156浏览 收藏
-
- 数据库 · Redis | 21小时前 |
- Redis Lua 脚本中如何保证多个 key 原子更新
- 311浏览 收藏
-
- 数据库 · Redis | 23小时前 |
- Redis Pub/Sub 订阅者断线后为什么收不到历史消息
- 287浏览 收藏
-
- 数据库 · Redis | 1天前 | Redis · 消息队列 · Stream · 消费组 · XREADGROUP XACK XPENDING XAUTOCLAIM Redis Streams Pending List
- Redis Streams XREADGROUP 后 Pending List 怎么处理
- 342浏览 收藏
-
- 数据库 · Redis | 1天前 | Redis · 排行榜 · Sorted Set · 分页设计 · 游标分页 · redis 分页 limit rev ZRANGE Sorted Set
- Redis Sorted Set 分数相同时怎么保证分页稳定
- 349浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis Hash 只给单个 field 设置过期时间为什么不行
- 456浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 82次使用
-
- OpenCompass
- OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
- 7次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 242次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 166次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 100次使用
-
- Go与Redis实现分布式互斥锁和红锁
- 2022-12-22 117浏览
-
- Go+Redis实现延迟队列实操
- 2023-02-23 426浏览
-
- 一文搞懂Go语言操作Redis的方法
- 2023-01-07 171浏览
-
- Golang分布式应用之Redis示例详解
- 2023-01-07 113浏览
-
- Go Redis客户端使用的两种对比
- 2022-12-30 195浏览

