必须用db.createuser()在目标库执行,否则用户建在admin导致权限错位;roles须为数组且角色名小写;密码含特殊字符需单引号包裹;连接串必须指定与用户创建库一致的authsource。

必须用 db.createUser() 在目标数据库上下文中执行,否则角色不生效、用户无法登录。
先 use 到你要授权的数据库
很多人连的是 admin 库,却在命令里写 roles: [{ role: "readWrite", db: "myapp" }],结果用户建在 admin 里,但权限指向 myapp ——这会导致后续连接时提示 Unauthorized。
- 要给
myapp库建读写用户,第一步必须是use myapp - 然后执行
db.createUser(),roles里的db字段可以写"myapp"(推荐显式写),也可以省略(此时默认作用于当前库) - 如果误在
admin库下执行,用户就真被创建在admin里,即使roles.db写了"myapp",认证时也会查admin.system.users,但权限检查仍按myapp做——逻辑错位
roles 必须是数组,哪怕只配一个角色
常见错误是把 roles 写成对象:{ role: "readWrite", db: "myapp" },MongoDB 会静默忽略该角色,用户建完只有空权限,登录后任何操作都报 NotAuthorized。
- 正确写法是
roles: [{ role: "readWrite", db: "myapp" }] - 如果还要加
dbAdmin(比如需要建索引),就写成roles: [{ role: "readWrite", db: "myapp" }, { role: "dbAdmin", db: "myapp" }] - 角色名大小写敏感,
"readwrite"或"ReadWrite"都无效,只能是"readWrite"
密码含特殊字符必须用单引号包裹
Shell 会提前解析 $、/、@ 等字符。比如 pwd: "pass$123",shell 把 $123 当成变量展开,实际传给 MongoDB 的密码变成空或乱码,导致 Authentication failed。
- 一律用单引号:
pwd: 'pass$123'、pwd: 'p@ss/word' - 双引号或不加引号都危险,尤其密码含
$时几乎必挂 - 驱动连接时若用 URL 形式,密码也需 URL 编码,但 shell 创建阶段只管单引号
连接字符串必须指定 authSource
启用 authorization: enabled 后,MongoDB 不再默认去当前库查用户,而是查 authSource 指定的库。省略或写错,就会报 Authentication failed,哪怕用户名密码完全正确。
- 如果用户建在
myapp库,连接串就得加&authSource=myapp - 更常见的是建在
admin库(尤其管理员或跨库用户),那就必须写&authSource=admin - Node.js 驱动示例:
mongodb://user:pass@localhost:27017/myapp?authSource=admin
最易被忽略的是 authSource 和数据库上下文的一致性:建用户时在哪库执行 use,决定了用户存哪;连的时候 authSource 得指向那个库,否则根本找不到用户记录。











