PgAdmin 6.10共享服务器非管理员保存密码后重连报错问题
PgAdmin 6.10 服务器模式非特权用户重连共享服务器报错排查
问题环境
- 部署基础:基于官方Docker镜像6.10版本全新安装的服务器模式PgAdmin
- 认证配置:已修改
config_local.py文件完成Azure AD的OAuth2认证配置
复现步骤
- 使用管理员账号添加共享服务器
- 切换非特权用户登录,在「属性 > 连接」栏设置目标服务器的对应用户名
- 输入密码并勾选保存密码后发起连接,首次连接可正常建立
- 断开服务器(或退出登录后重新登录)再次发起连接时触发故障
报错表现
- 前端页面提示错误:
not enough values to unpack (expected 3, got 2)
- 后台服务日志输出:
2022-06-07 09:03:28,114: ERROR pgadmin: 'utf-8' codec can't decode byte 0x9a in position 1: invalid start byte pgadmin-and-backup-prod_1 | Traceback (most recent call last): pgadmin-and-backup-prod_1 | File "/pgadmin4/pgadmin/utils/driver/psycopg2/connection.py", line 242, in _decode_password pgadmin-and-backup-prod_1 | password = password.decode() pgadmin-and-backup-prod_1 | UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9a in position 1: invalid start byte pgadmin-and-backup-prod_1 | 2022-06-07 09:03:28,116: ERROR pgadmin: not enough values to unpack (expected 3, got 2) pgadmin-and-backup-prod_1 | Traceback (most recent call last): pgadmin-and-backup-prod_1 | File "/pgadmin4/pgadmin/browser/server_groups/servers/__init__.py", line 1418, in connect pgadmin-and-backup-prod_1 | status, errmsg = conn.connect( pgadmin-and-backup-prod_1 | File "/pgadmin4/pgadmin/utils/driver/psycopg2/connection.py", line 294, in connect pgadmin-and-backup-prod_1 | is_error, errmsg, password = self._decode_password(encpass, manager, pgadmin-and-backup-prod_1 | ValueError: not enough values to unpack (expected 3, got 2)
- 特殊现象:管理员账号读取已保存密码功能正常,可正常执行断开、重连操作,不会触发上述故障
故障根因
该问题为PgAdmin 6.10版本的已知逻辑bug:非特权用户保存共享服务器密码时,程序错误读取了共享服务器创建者(即管理员账号)的加密密钥对密码做加密存储;用户重连时程序读取当前登录的非特权用户自身的密钥尝试解密,得到的字节流不符合UTF-8编码规范触发解码错误,而密码解码函数在捕获解码异常时返回值数量不符合上层逻辑预期(预期返回3个参数,实际仅返回2个),最终触发解包报错。
修复方案
- 永久修复:将PgAdmin Docker镜像升级至6.11及以上版本,官方已在该版本修复共享服务器场景下非管理员用户密码存储的密钥作用域错误问题
- 临时规避:若暂时无法升级版本,非特权用户连接共享服务器时不要勾选「保存密码」选项,每次连接手动输入密码即可规避报错
- 故障恢复:已经触发报错的用户,可进入对应服务器的属性配置页清空已保存的无效密码配置,重新输入密码(不勾选保存)即可恢复临时连接能力
内容的提问来源于stack exchange,提问作者Ricla
相关产品推荐
相关产品推荐

