MongoDB 6.0.2容器连接失败:SCRAM-SHA-1认证错误求助
MongoDB 6.0.2 连接认证失败及updateUser命令问题解决
一、连接认证失败问题解决
问题根源
MongoDB 6.0 默认仅启用 SCRAM-SHA-256 作为认证机制,而你的Go mongo驱动默认使用 SCRAM-SHA-1,导致双方认证机制不匹配,触发认证失败错误。
解决方案
有两种可行方案,优先推荐方案1:
方案1:修改客户端代码,指定SCRAM-SHA-256认证机制
在认证配置中明确指定认证机制为SCRAM-SHA-256,适配MongoDB 6.0的默认设置:
auth := options.Credential{ AuthSource: "admin", Username: userName, Password: pass, AuthMechanism: "SCRAM-SHA-256", // 指定MongoDB 6.0默认的认证机制 } opts := options.Client().ApplyURI(URI).SetAuth(auth).SetTLSConfig(&config) client, err := mongo.Connect(ctx, opts)
方案2:修改MongoDB服务端启动参数,兼容SCRAM-SHA-1
如果需要兼容依赖SCRAM-SHA-1的旧客户端,可以在容器启动命令中添加参数,同时启用两种认证机制:
--authenticationMechanisms=SCRAM-SHA-1,SCRAM-SHA-256
不建议仅启用SCRAM-SHA-1,因为它的安全性低于SCRAM-SHA-256,不符合MongoDB 6.0的安全推荐。
二、updateUser命令兼容性说明
updateUser 命令在MongoDB 6.0.2中并未被弃用,但需要注意以下细节:
- 执行命令的用户必须具备
userAdmin或userAdminAnyDatabase权限 - 修改管理员用户时,必须在
admin数据库下执行命令(而非业务数据库) - 你的代码逻辑本身没问题,但建议确保字段名使用原始字符串(避免转义歧义),调整后的示例:
res := struct{ Ok int }{} opts := options.RunCmd().SetReadPreference(readpref.Primary()) command := bson.D{{"updateUser", usrName}, {"pwd", pass}} // 修改管理员用户需指定admin数据库 err = client.Database("admin").RunCommand(context.TODO(), command, opts).Decode(&res)
内容的提问来源于stack exchange,提问作者Gopher_k
相关产品推荐
相关产品推荐

