Redis 6.0 开启 ACL 后消息队列客户端怎么连接配置?

文章导读
Redis 6.0 开启 ACL 后,消息队列客户端需在连接配置中显式指定用户名和密码,若使用默认 default 用户可仅配密码。集群环境下需在每个节点单独配置 ACL 规则,否则重定向后会认证失败。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Redis 6.0 开启 ACL 后,消息队列客户端需在连接配置中显式指定用户名和密码,若使用默认 default 用户可仅配密码。集群环境下需在每个节点单独配置 ACL 规则,否则重定向后会认证失败。

先说结论:Redis 6.0+ 客户端连接必须适配 ACL 认证格式,集群模式需逐节点同步配置。

  • 适合:Redis 6.0 及以上版本单机或集群架构。
  • 先准备:规划用户名、密码及 Key 访问权限规则。
  • 验收:使用 ACL WHOAMI 命令确认连接用户身份无误。

命令速用版

服务端创建用户并授权,客户端连接时传入用户名和密码参数。

# 服务端创建用户 order_svc,密码 ord123!,允许访问 order:* 开头的 Key
ACL SETUSER order_svc on >ord123! ~order:* +@read +@write

# Python 客户端连接示例
import redis
r = redis.Redis(host='localhost', port=6379, username='order_svc', password='ord123!')

# Java Jedis 客户端连接示例
Jedis jedis = new Jedis("localhost", 6379, "order_svc", "ord123!");

为什么会这样

Redis ACL 是服务端本地状态,集群节点间不会自动同步用户权限配置。Redis 6.0 引入 ACL 机制后,默认保留 default 用户以实现向后兼容,但自定义用户必须显式认证。

Redis Cluster 的节点间只同步数据分片和拓扑信息,ACL SETUSER 命令不会广播到其他节点。若只在一个节点配置用户,客户端请求被重定向到未配置该用户的节点时,会因认证失败或权限缺失报错 NOAUTH 或 NOPERM。此外,未显式指定用户名时,Redis 默认将密码关联到 default 用户,这是为了兼容旧版本客户端只验证密码的习惯。

分步处理

按照服务端配置、客户端适配、集群同步的顺序进行部署,确保每个环节权限一致。

1. 服务端创建用户

在 redis.conf 中启用 ACL 并指定 aclfile 路径,或直接使用命令创建用户。建议将配置写入 aclfile 以便持久化。

# redis.conf 配置
aclfile /etc/redis/acl.conf
acl-enabled yes

# 执行命令创建用户
ACL SETUSER app_user on >SecurePass123 ~app:* +@read +@write
ACL SAVE

2. 客户端连接配置

Redis 6.0 开启 ACL 后消息队列客户端怎么连接配置?

修改消息队列客户端代码或配置文件,填入用户名和密码。旧版 AUTH 命令仅支持密码,新版需支持 USER 参数。

  • Python redis-py:构造函数中增加 username 参数。
  • Java Jedis:使用支持 user 参数的构造函数或 JedisClientConfig。
  • Java Lettuce:RedisURI 中使用 redis://user:password@host:port 格式。

3. 集群环境同步

登录集群中每个节点(包括 Master 和 Slave),执行相同的 ACL SETUSER 命令。若禁用 default 用户,需确保所有管理工具支持 ACL 认证。

# 对每个节点执行
redis-cli -h node_ip -p 6379 -a password ACL SETUSER app_user on >SecurePass123 ~app:* +@read +@write
redis-cli -h node_ip -p 6379 -a password ACL SAVE

怎么验证是否生效

通过服务端命令检查当前连接用户身份及权限范围,确认无认证报错。

  • 检查当前用户:执行 ACL WHOAMI,返回应为配置的用户名(如 app_user)。
  • 检查权限细节:执行 ACL GETUSER app_user,查看 keys 和 commands 字段是否符合预期。
  • 业务验证:尝试访问授权范围内的 Key 成功,访问未授权 Key 或命令被拒绝。

常见坑

集群 ACL 不同步、默认用户禁用导致工具失效、客户端库版本不支持用户名参数是主要风险点。

  • 集群 ACL 未同步:只配置了 Master 节点,Slave 节点故障切换后新 Master 无该用户,导致业务中断。
  • Default 用户被禁用:若执行 ACL SETUSER default off,官方集群工具 redis-cli `--cluster` 可能因无法认证而报错 NOAUTH。
  • 客户端库版本过低:旧版 Jedis 或 redis-py 可能不支持 username 参数,需升级客户端库或配置。
  • Key 前缀匹配限制:ACL 限制 Key 前缀(如 ~app:*)不阻止跨 slot 访问,仍需依赖集群分片逻辑。

常见问题

只配置密码不配用户名可以吗?

可以,但仅限使用默认的 default 用户。Redis 会自动将仅密码认证关联到 default 用户,若自定义用户则必须指定用户名。

集群模式下 ACL 需要每个节点都配吗?

需要。Redis 集群 ACL 不全局同步,每个节点独立维护 acl.conf 和内存规则,必须逐节点配置并保存。

旧版客户端不支持用户名怎么办?

保留 default 用户并设置密码,旧客户端可继续使用密码认证,但无法享受多用户权限隔离的安全特性。

参考来源

  • Redis 6.0 集群如何开启 ACL_配置用户权限实现集群节点间的安全隔离
  • Redis 6.0 集群如何配置多用户访问控制_通过 ACL 命令为不同业务分配 Namespace 权限
  • redis6.x 增加 acl 客户端连接 redis 配置为什么只需要配置密码 而不需要配置用户呢
  • 如何连接 ACL 认证的 Redis
  • Redis 6.0 访问控制列表 ACL 说明 - jyzhou - 博客园