Redis用户默认只读咋办,怎么改成能写还能读的权限呢
- 问答
- 2026-01-23 22:43:23
- 2
这个问题通常出现在使用Redis 6.0及以上版本时,因为从这个版本开始,Redis引入了更完善的访问控制列表(ACL)功能,可以更精细地管理用户权限,很多云服务商或者自己搭建Redis时,为了安全起见,创建的默认用户可能只有读权限。
为什么会有默认只读用户? 这主要是出于安全考虑,想象一下,如果你的应用程序只需要从Redis里读取一些缓存数据,比如网站的文章内容、商品信息等,那么给它一个只能读不能写的账号,就算这个应用程序的代码有漏洞被黑客利用了,黑客也无法通过这个账号修改或删除你Redis里的重要数据,这就起到了一个安全防护的作用,这是一种叫做“最小权限原则”的安全实践,只授予账户完成其任务所必需的最小权限。
怎么知道我的用户是不是只读的?
你需要确认你当前使用的用户确实只有读权限,如果你能连接到Redis,可以尝试执行一个写的命令来测试,比如试着用 SET mykey "test" 命令往Redis里写一个简单的键值对,如果返回的错误信息是 (error) NOPERM this user has no permissions to run the 'set' command 或类似的提示,那就说明你的用户没有写的权限。

更准确的方法是,使用一个有足够权限的账号(比如默认的超级用户)来查看你的用户的权限配置,你可以使用 ACL LIST 命令来列出所有用户及其权限,在返回的结果中,你会看到类似这样的行:
user default on xxxxxx ~* &* +@all
user my_readonly_user on xxxxxx ~* &* +@read
这里的关键是最后一部分,+@read 表示这个用户只有读命令的权限,而超级用户通常是 +@all,表示拥有所有权限。
如何将一个只读用户改成可读可写?
核心的方法就是使用Redis的ACL命令来修改用户的权限,你需要一个有权管理用户权限的账号来执行这个操作,通常就是默认的default用户(如果没改过密码且未禁用的话)或者你已知的另一个管理员账号。

具体操作步骤如下:
-
连接Redis:使用Redis命令行工具
redis-cli连接到你的Redis服务器,你可能需要指定主机地址、端口和密码。redis-cli -h your_redis_host -p 6379 -a your_password -
验证当前权限(可选但推荐):先执行
ACL WHOAMI确认当前登录的用户,然后尝试执行ACL LIST查看目标用户的权限详情。
-
修改用户权限:使用
ACL SETUSER命令来重新配置目标用户,这是最关键的一步。 如果你想直接给用户所有权限(可读可写且能执行管理命令),可以运行:ACL SETUSER your_username on >your_password ~* &* +@all让我们分解一下这个命令:your_username:你要修改的那个只读用户的用户名。on:启用这个用户。>your_password:设置用户的新密码,如果你不想改密码,可以省略>your_password部分。- :表示这个用户可以访问所有键。 后面跟的是键的模式, 代表所有。
&*:这是Redis 7.0及以上版本引入的,表示用户可以访问所有发布/订阅频道,如果你的版本是7.0以上,最好加上。+@all:给用户添加所有命令的权限,这是从只读变成可读可写的核心, 表示添加权限,@all表示所有命令的类别。
如果你不想给用户那么大的权限(比如不想让它执行
FLUSHDB这种危险的管理命令),可以只给它读写权限,而不是全部权限,一个更安全的做法是:ACL SETUSER your_username on >your_password ~* &* +@read +@write -@dangerous这个命令的意思是:授予读命令权限(+@read)、写命令权限(+@write),但排除危险命令(-@dangerous),这样更符合生产环境的安全要求。 -
验证修改结果:修改完成后,再次使用
ACL LIST命令检查目标用户的权限字符串是否已经变成了+@read +@write或+@all,用这个用户重新登录,尝试执行读命令(如GET mykey)和写命令(如SET mykey2 "value"),确认读写功能都正常。
一些特殊情况和建议
- 参考Redis官方文档关于ACL的说明:Redis的ACL系统非常灵活,除了简单的读写分类,还可以精确到控制单个命令的权限,如果你有更复杂的需求,可以查阅官方文档。
- 配置文件修改:通过命令行修改的ACL规则在Redis重启后会丢失,除非你执行了
ACL SAVE命令将当前ACL规则保存到配置文件(通常是redis.conf)中,执行ACL SAVE会将用户配置持久化,你也可以直接修改Redis配置文件中的user指令块,然后重启Redis生效,但更推荐使用命令行修改后保存的方式。 - 云数据库服务:如果你使用的是阿里云、腾讯云等云服务商提供的Redis数据库,通常他们会提供一个管理控制台,修改用户权限的操作可能需要在控制台上完成,因为可能限制了直接使用
ACL命令,你需要登录到云服务商的管理后台,找到Redis实例的用户管理或权限设置部分进行操作。 - 谨慎授予权限:虽然把用户改成
+@all最省事,但从安全角度出发,强烈建议遵循“最小权限原则”,你的应用程序需要什么权限,就只给它什么权限,一个只做缓存的程序,可能只需要GET、SET、EXPIRE等几个命令的权限,你可以使用ACL SETUSER精确添加这些命令,而不是直接给整个写权限。
将Redis只读用户改为可读可写,本质上是使用ACL SETUSER命令,通过+@write或+@all参数来为用户添加写命令的权限,操作前请确保你用的账号有权限管理其他用户,并且操作后记得验证和持久化保存配置。
本文由帖慧艳于2026-01-23发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/84722.html
