Docker部署MongoDB4.4.2环境下PyMongo认证新建用户失败
MongoDB 4.4容器部署场景下PyMongo用户认证失败排查指南
- 优先排查输入参数的字符匹配问题
创建用户时设置的密码为TestPwd(首字母T、中间P为大写),但测试连接的连接串中填写的密码为testPwd,存在大小写字符不匹配,这是认证失败的最直接原因。 - 补全认证源配置参数
你是在test库的会话上下文下执行createUser命令创建的TestUser,该用户的认证归属库为test。PyMongo在连接串未显式指定认证源时,会默认使用admin库执行账号校验,自然无法匹配存放在test库下的用户条目。可使用补全参数的连接串测试:mongodb://TestUser:TestPwd@172.20.0.3:27017/?authSource=test - 对齐两侧的认证机制版本
MongoDB 4.4默认采用SCRAM-SHA-256作为认证机制,如果容器启动配置中强制要求旧版SCRAM-SHA-1机制,创建用户时会存储对应版本的密码哈希,若PyMongo侧未指定匹配的认证机制,会导致校验流程不兼容。可根据实际启动配置在连接串中显式声明认证机制:mongodb://TestUser:TestPwd@172.20.0.3:27017/?authSource=test&authMechanism=SCRAM-SHA-256 - 避免本地Shell连接的误导性判断
容器内部执行mongo命令可以正常连接,是因为触发了MongoDB的本地主机例外机制:只要是从mongod运行的本地节点发起的无密码连接,会自动获取本地权限,全程不会实际校验TestUser账号的合法性,因此这个连接状态不能证明用户创建流程正确。可在容器内执行带明确认证参数的连接命令复现问题:mongo -u TestUser -p TestPwd --authenticationDatabase test
若该命令同样返回认证失败,说明问题出在用户配置本身,与PyMongo无关。 - 处理同名用户的缓存冲突
如果此前曾在admin库、其他业务库下创建过同名的TestUser账号,即使当前test库下能查询到TestUser的用户条目,mongod内部的SCRAM校验缓存可能存在冲突,导致认证时错误匹配其他库下的同名用户。可先删除test库下的旧用户条目,再以完整参数重新创建用户,创建时显式声明角色归属和认证机制:test_db.command( "createUser", "TestUser", pwd="TestPwd", roles=[{"role": "readWrite", "db": "test"}], mechanisms=["SCRAM-SHA-256"] )
内容的提问来源于stack exchange,提问作者Jzbach
相关产品推荐
相关产品推荐

