一键解决缓存频道默认账户权限问题
1 简介
在项目实施过程中,缓存加密需要认证,此时配置不当极容易造成访问权限缺失的问题。

例如 go-redis/v9 连接redis缓存后订阅错误:NOPERM No permissions to access a channel
通常是由于以下几种原因导致的go-redis/v9 库进行 Redis 发布订阅(pub/sub)时,出现 proto.PermissionError{msg:“NOPERM No permissions to access a channel”} 错误。
- Redis ACL (访问控制列表) 配置问题
Redis 6 引入了 ACL (Access Control List),允许对不同的用户设置不同的权限。如果你的 Redis 实例启用了 ACL 功能,并且当前使用的 Redis 用户没有访问发布/订阅通道的权限,就会出现 NOPERM No permissions to access a channel 错误。
2 常见权限问题解决方法:
确认你在连接到 Redis 时,使用的用户是否有足够的权限进行发布和订阅操作。
你可以通过 Redis 的 ACL GETUSER <username> 命令检查用户的权限,确保 SUBSCRIBE 和 PUBLISH 权限被授予。
如果需要的话,可以通过 ACL SETUSER <username> +subscribe +publish 来授予订阅和发布权限。
*检查 ACL 用户权限:
ACL GETUSER your_redis_user
为用户授予权限:
ACL SETUSER your_redis_user +subscribe +publish
为默认账号授权,无需密码
ACL SETUSER default on nopass +@all ~* &* +acl|setuser +acl|save
保存规则
ACL SAVE
-
- 客户端使用错误
检查是否在调用 Subscribe 或 ReceiveMessage 时,传入的参数或者上下文没有正确处理。
可能的原因:
SubTopicBooked 的通道名称是否正确?确保该名称与 Redis 中发布的通道一致。
ctx 是否正确传递 ,确保上下文对象没有被取消或超时。
-
- Redis 服务器配置
检查 Redis 服务器的配置文件,看看是否对发布订阅通道有任何特定的限制。虽然这不常见,但某些 Redis 配置可能会影响 pub/sub 行为。
-
- Redis 实例或客户端版本问题
确保你的 Redis 服务器和 go-redis 客户端库版本兼容,并且没有已知的 bug。可以尝试更新 go-redis 到最新版本,或者检查是否有发布订阅方面的已知问题。
-
- 使用 Redis 连接池
如果使用了 Redis 连接池,可能存在连接管理方面的问题。确保池中的连接没有出现权限问题,并且连接没有被关闭或断开。
3 小结 排查步骤:
检查 ACL 配置:确认用户是否有 subscribe 和 publish 权限。
确认通道名和上下文:确保订阅的通道名称正确,且上下文 (ctx) 没有过期或取消。
检查 Redis 版本:确认 Redis 和 go-redis 客户端版本是否兼容。
查看 Redis 日志:查看 Redis 服务器的日志,看是否有任何与权限相关的错误或警告。
如果这些步骤都确认没有问题,通常问题出在 Redis 用户权限上,需要调整 ACL 配置。
- 点赞
- 收藏
- 关注作者
评论(0)