bigywater.tech
常见报错 · 13

Redis NOAUTH / WRONGPASS / NOPERM:认证前连 PING 都不行,没设密码时 AUTH default 反而成功

“NOAUTH Authentication required”、“WRONGPASS invalid username-password pair or user is disabled”、“ERR AUTH called without any password configured” 是连 Redis 时最常见的三个认证报错,还有 ACL 引入后的 NOPERM。这篇在本机把它们都复现,看清楚每一个在什么条件下出现、有什么出人意料的地方。

3 个
认证之前能执行的命令(AUTH、RESET、QUIT),PING 等其余命令都是 NOAUTH
OK
没设密码的实例上 AUTH default <任意密码> 返回 OK(只给一个参数的 AUTH 才报 ERR)
0
改 requirepass 之后已经认证的旧连接被踢掉的个数:0

NOAUTH

实测 · 本机执行输出
  > GET k
      (error) NOAUTH Authentication required.
  认证之前执行 PING             -> NOAUTH
  认证之前执行 ECHO x           -> NOAUTH
  认证之前执行 INFO             -> NOAUTH
  认证之前执行 SELECT 1         -> NOAUTH
  认证之前执行 CLIENT SETNAME   -> NOAUTH
  认证之前执行 COMMAND COUNT    -> NOAUTH
  认证之前执行 HELLO 2          -> NOAUTH
  认证之前执行 AUTH secret      -> 可用
  认证之前执行 RESET            -> 可用
  认证之前执行 QUIT             -> 可用

设了 requirepass 的实例,认证之前几乎所有命令都被拒绝,包括 PING 和 HELLO。健康检查要带密码。

WRONGPASS 与无密码时的 AUTH

实测 · 本机执行输出
  > AUTH wrong
      (error) WRONGPASS invalid username-password pair or user is disabled.
  > AUTH default wrong
      (error) WRONGPASS invalid username-password pair or user is disabled.
  > AUTH nosuchuser secret
      (error) WRONGPASS invalid username-password pair or user is disabled.
  > AUTH secret
      "OK"
  > GET k
      (nil)
  > AUTH anything
      (error) ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?
  > AUTH default anything
      "OK"
  > GET k
      (nil)

密码错、用户不存在、用户被禁用报同一条 WRONGPASS;没设密码的实例上单参数 AUTH 报 ERR,而 AUTH default <任意> 返回 OK。

ACL 的 NOPERM

实测 · 本机执行输出
  > SET app:1 x
      "OK"
  > SET other:1 x
      (error) NOPERM No permissions to access a key
  > DEL app:1
      (error) NOPERM User app has no permissions to run the 'del' command
  > PUBLISH news:today hi
      (integer) 0
  > PUBLISH secret:ch hi
      (error) NOPERM No permissions to access a channel
  > EVAL return redis.call('GET', 'other:1') 0
      (error) NOPERM User app has no permissions to run the 'eval' command
  > MGET app:1 other:1
      (error) NOPERM User app has no permissions to run the 'mget' command
  ACL LOG(管理员查看拒绝记录)前 4 条的 reason / object / username:
      reason=command context=toplevel object=mget username=app
      reason=command context=toplevel object=eval username=app
      reason=channel context=toplevel object=secret:ch username=app
      reason=command context=toplevel object=del username=app
  > AUTH app apppw
      (error) WRONGPASS invalid username-password pair or user is disabled.

key、命令、频道三种授权失败的文本不同,管理员可用 ACL LOG 看到被拒绝的原因和对象。

改密码

实测 · 本机执行输出
  旧连接(用 secret 认证过)GET k -> (nil)
  CONFIG SET requirepass newpass 之后,旧连接 GET k -> (nil)
  新连接 AUTH secret(旧密码)-> (error) WRONGPASS invalid username-password pair or user is disabled.
  新连接 AUTH newpass -> "OK",GET k -> (nil)
  CONFIG SET requirepass "" 清空之后,全新连接不认证直接 GET k -> (nil)

已认证的连接不受影响;新连接只认新密码;requirepass 设空就是不再要求认证。

客户端写法

实测 · 本机执行输出
  AUTH <密码>                    -> OK;之后 PING -> "PONG"
  AUTH default <密码>            -> OK;之后 PING -> "PONG"
  HELLO 2 AUTH default <密码>    -> OK;之后 PING -> "PONG"
  HELLO 2 AUTH default wrong -> (error) WRONGPASS invalid username-password pair or user is disabled.
  redis-cli -p 8140 -a secret PING -> stdout='PONG',stderr="Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe."
  redis-cli -p 8140 PING(不带密码)-> stdout='NOAUTH Authentication required.',stderr=''
  环境变量 REDISCLI_AUTH=secret,redis-cli -p 8140 PING -> stdout='PONG',stderr=''

AUTH、AUTH default、HELLO 都行;redis-cli -a 会有安全警告,REDISCLI_AUTH 环境变量没有。

分步演示

认证失败
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / MySQL 26.10.0 与 Redis 8.10.2(Homebrew,每个实验自己起实例,端口 9150 以上,只监听 127.0.0.1,不碰本机已有的实例)/ Python 3.15.0 + PyMySQL(按各篇注明用到哪些及版本);报错文本都是真实复现时原样捕获的;计时用 time.perf_counter,数字每次运行会有小幅抖动。本篇用两个自己起的 Redis 8.10.2 实例(端口 8140 设 requirepass,8141 无密码),纯标准库 RESP 客户端和 Homebrew 的 redis-cli;ACL 用户在运行时用 ACL SETUSER 创建
    • 没有验证:RESP3(HELLO 3)下的认证与错误回复格式(本篇的客户端只解析 RESP2);TLS 与客户端证书认证;ACL 文件(aclfile)和 requirepass 同时配置时的优先级;sentinel / cluster 间认证(masterauth、masteruser);各语言客户端库把这些错误映射成什么异常;密码里含特殊字符时的转义;ACL 的 selector 与 %R~ / %W~ 读写分离授权
    京ICP备2026067502号-1京公网安备11010502063487号