必须在 config server 的 admin 数据库中直连创建全局管理员用户,角色需显式指定为 { role: "root", db: "admin" },连接 mongos 时须指定 authSource=admin,且 config server 自身必须启用 security.authorization: enabled。

在 config server 上创建用户,不是任意 mongos
分片集群的用户权限体系里,全局管理员(root 或 clusterAdmin)必须在 config server 的本地 admin 数据库中创建,而不是连着 mongos 去加。连 mongos 执行 db.createUser() 只会在 config server 的 admin 库生效——但如果你没直连 config server,而是误连了 mongos,MongoDB 会静默转发到 config server,看似成功,实则可能因认证机制或角色解析顺序出问题,尤其在 4.4+ 版本后更敏感。
实操建议:
- 用
mongo --host <config_server_host>:27019 -u <existing_admin> -p --authenticationDatabase admin</existing_admin></config_server_host>直连其中一个 config server(端口通常是27019) - 确认当前数据库是
admin:use admin - 执行
db.createUser(),角色必须显式指定为{ role: "root", db: "admin" }(不能只写"root"字符串) - 避免使用
clusterManager等模糊角色名,它不等价于全局管理能力
用户必须带 authSource=admin 连接 mongos 才能生效
即使你在 config server 上正确建好了用户,从应用或 shell 连 mongos 时,如果没指定 authSource=admin,MongoDB 默认去 test 库查用户,自然失败。错误现象通常是:Authentication failed. 或 not authorized on admin to execute command { getCmdLineOpts: 1 }。
实操建议:
- 连接命令必须包含
--authenticationDatabase admin(shell)或连接字符串里写authSource=admin - 在驱动里(如 Node.js 的
mongodb包),确保authSource显式设为"admin",不要依赖默认值 - 检查
mongos日志是否有Failed to authenticate并带authDB: test,这是典型配置遗漏信号
root 角色 ≠ 对所有分片数据自动有读写权
创建 root 用户只是给了它管理集群的权限(比如增删分片、查看 config 库、执行 sh.status()),但它对业务数据库(比如 myapp)没有默认访问权。你仍需单独在对应数据库上授权,或在 admin 库中赋予跨库角色(如 { role: "readWriteAnyDatabase", db: "admin" })。
常见错误现象:
- 用
root用户连mongos后执行use myapp+db.users.find()报not authorized on myapp to execute command { find: ... } - 误以为
root能直接操作分片集合,其实它和普通用户一样受数据库级权限控制
实操建议:
- 若需全局数据操作权,创建用户时额外加角色:
{ role: "readWriteAnyDatabase", db: "admin" } - 生产环境慎用
AnyDatabase类角色,优先按需授予具体库+角色 - 验证权限:连上后执行
db.runCommand({ connectionStatus: 1 }).authInfo.authenticatedUserRoles,确认返回的角色列表含预期项
副本集模式下 config server 必须启用访问控制(security.authorization: enabled)
很多团队只给 mongos 和 shard 配了 authorization: enabled,却忘了 config server 本身也得开。否则即使你在 config server 上建了用户,它也不会校验凭证,导致后续所有通过 mongos 的认证都绕过,或者出现「用户存在但无法登录」的诡异行为。
实操建议:
- 检查每个 config server 的配置文件,确认
security.authorization: enabled已设置(不是只在mongos或 shard 上配) - 重启 config server 后,必须先用本地
localhostexception 创建第一个用户(即未开启 auth 前连 localhost 创建),再启用 auth;否则无法初始化管理员 - 如果 config server 是副本集,所有节点配置必须一致,否则主节点启了 auth、从节点没启,会导致选举失败或同步中断
最容易被忽略的是 config server 的 auth 配置本身——它不像 mongos 那样常被关注,但一旦漏掉,整个集群的用户体系就形同虚设。连上 config server 后第一件事,不是建用户,而是跑 db.runCommand({ getCmdLineOpts: 1 }) 看输出里 parsed.security.authorization 是否为 true。

















