必须显式指定scram-sha-256机制及authsource,php扩展不自动探测;密码含特殊字符需url编码;服务端未启用--auth则认证不触发。

MongoDB SCRAM 认证在 PHP 中必须通过 mongodb:// 连接字符串显式指定用户名、密码、认证数据库和机制,仅靠扩展安装或环境变量无法自动启用。
SCRAM-SHA-1 与 SCRAM-SHA-256 的机制差异必须显式声明
PHP MongoDB 扩展(ext-mongodb)默认不自动探测服务端支持的 SCRAM 变体。如果 MongoDB 服务端是 4.0+ 且启用了 SCRAM-SHA-256(例如使用 x.509 或 LDAP 集成时常见),而连接字符串未指定机制,会报错 Authentication failed 或 Unsupported SASL mechanism。
-
SCRAM-SHA-1:MongoDB 3.0–4.0 默认,兼容性广,连接时可省略authMechanism(但不推荐) -
SCRAM-SHA-256:MongoDB 4.0+ 支持,更安全,必须显式写入连接字符串,例如:mongodb://user:pass@localhost:27017/?authSource=admin&authMechanism=SCRAM-SHA-256 - 服务端若强制要求
SCRAM-SHA-256(如配置了setParameter: { saslMechanismHost: "..." }),客户端漏写authMechanism会直接拒绝认证
authSource 必须指向实际存放用户凭证的数据库
很多人误以为 admin 是唯一合法值,其实 authSource 是用户文档所在库 —— 它可以是 admin,也可以是任意自定义库(比如 myapp_auth),只要该库中用 db.createUser() 创建过对应用户。
- 创建用户时指定库:
use admin; db.createUser({user:"api", pwd:"x", roles:[{role:"readWrite", db:"mydb"}]})→ 此时authSource=admin - 若用户建在
myapp_auth库:use myapp_auth; db.createUser(...)→ 连接字符串中必须写&authSource=myapp_auth - 遗漏或写错
authSource会导致Failed to authenticate credentials,错误日志里通常不提示具体哪个库查无此人
密码中含特殊字符(如 /、@、:)必须 URL 编码
PHP 的 MongoDB\Driver\Manager 在解析连接字符串时严格遵循 URI 标准。未编码的 @ 会被当作用户名/密码分隔符截断,/ 会被当作路径起始,导致解析出错或认证凭据不完整。
- 原始密码:
pa@ss/wd:123→ 必须编码为pa%40ss%2Fwd%3A123 - 推荐用
rawurlencode()处理密码部分(注意:只编码密码,不要整个 URI 编码) - 错误示例:
mongodb://user:pa@ss/wd@localhost/→ 实际解析为用户user、密码pa、主机ss/wd@localhost,必然失败
最容易被忽略的是:即使连接字符串语法正确,如果服务端 mongod 启动时没加 --auth 或配置文件中 security.authorization: enabled 未生效,SCRAM 认证根本不会触发 —— 此时连不上是权限问题,不是认证配置问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











