MongoDB 6.0 默认禁用认证,必须先停服务、创建admin用户再启用authorization;配置仅支持YAML格式且缩进严格,客户端连接须显式指定--authenticationDatabase admin,角色权限不可自动撤销。

MongoDB 6.0 默认不启用认证,必须显式开启 security.authorization 才能使用 RBAC(基于角色的访问控制)。跳过这步直接创建用户或配置角色,后续所有权限操作都无效。
先关服务、再建管理员,顺序不能反
认证开启前必须先创建至少一个有管理权限的用户,否则开启后将无法连接 admin 数据库执行任何用户操作。常见错误是先改配置重启,结果连 use admin 都被拒绝。
- 确保 mongod 已停止(
mongod --shutdown或 kill 进程) - 用默认方式启动无认证的实例:
mongod --dbpath /data/db - 连接后立即执行:
use admin db.createUser({ user: "admin", pwd: "strongPass123!", roles: ["root"] }) - 成功返回
{ ok: 1 }后再关闭服务
配置文件里只写 authorization: enabled,别碰 auth
MongoDB 6.0 已弃用 auth=true 配置项,继续使用会导致启动失败或静默忽略。必须用 YAML 格式配置,且缩进严格(2 空格)。
- 编辑
mongod.conf,在security:下添加:
security: authorization: enabled
- 不要写
auth: true,也不要在命令行加--auth—— 这在 6.0+ 中已不兼容 - 确认配置语法合法:
mongod --config /etc/mongod.conf --dryRun
客户端连接必须指定 --authenticationDatabase admin
用户是在哪个数据库下创建的,认证就必须指向那个库。6.0 默认不再接受隐式 admin,漏掉这个参数会报 Authentication failed。
- 正确方式(命令行):
mongosh "mongodb://localhost:27017" -u admin -p strongPass123! --authenticationDatabase admin - Shell 内认证(先连再验):
use admin db.auth("admin", "strongPass123!") - 注意:一次 shell 会话只能
db.auth()一次,重复调用会触发logical sessions can't have multiple authenticated users
角色继承和权限叠加不自动撤回
RBAC 没有“权限减法”逻辑。给已有 readWriteAnyDatabase 的用户再加个 read 角色,不会限制其写权限;想收权必须显式 revokeRolesFromUser。
- 查看当前用户全部权限:
db.runCommand({ rolesInfo: { role: "root", db: "admin" }, showPrivileges: true }) - 撤销某个角色:
db.revokeRolesFromUser("admin", [{ role: "userAdminAnyDatabase", db: "admin" }]) - 自定义角色需在
admin库创建,才能跨库授权;普通库的角色只能作用于本库
最容易被忽略的是:6.0 的 SCRAM-SHA-256 是默认认证机制,但旧客户端(如某些驱动老版本)可能不支持。如果连接时卡在 auth handshake,先检查客户端是否升级到支持 SHA-256 的版本,而不是怀疑配置写错了。

















