必须在admin库执行db.createRole(),资源需精确指定db和collection,空collection字段仅覆盖非系统集合,权限约2分钟后生效。

直接在 admin 数据库中用 db.createRole() 创建,权限粒度可精确到集合甚至命令,但必须注意资源范围写法和生效延迟。
自定义角色必须在 admin 库执行
MongoDB 要求所有角色(包括自定义角色)的元数据统一存于 admin 库。即使你只想控制 orderDB 下某个集合,创建角色的操作也得先 use admin,否则会报错 "not authorized on admin to execute command"。
- 错误做法:
use orderDB后调用db.createRole() - 正确流程:先
use admin,再执行db.createRole({role: "...", privileges: [...]}) - 权限中的
resource.db字段可以是任意数据库名(如"orderDB"),与当前所在库无关
privileges 中的 resource 和 actions 怎么配才有效
privileges 是权限核心,它由 resource(操作对象) + actions(允许动作)组成。常见错误是把 collection 写成 "*" 或留空却误以为表示“所有集合”——实际留空 "" 表示“该数据库下所有非系统集合”,而 "*" 会被忽略或报错。
- 只允许查
orderDB的orders集合:{db: "orderDB", collection: "orders"} - 允许查
orderDB所有业务集合(不含系统集合):{db: "orderDB", collection: ""} - 允许执行
find和insert,但禁止update或remove:actions: ["find", "insert"] - 不支持通配符集合名,
collection: "order*"无效
角色创建后不是立刻生效
控制台或 shell 创建/修改角色后,系统需约 2 分钟完成后台同步。这期间用新角色创建的用户可能连接成功但权限不生效,容易误判为配置错误。
- 验证方式:用新账号连接后,执行
db.runCommand({connectionStatus: 1})查看authInfo.roles是否包含预期角色 - 若权限未体现,不要立即重试创建,等满 2 分钟后再测试
- 通过驱动(如 Node.js)创建角色时,
db.createRole()返回成功不代表权限已就绪
最易被忽略的是 resource.collection 的语义:空字符串 "" ≠ "*",也不等于省略字段;它有明确的 MongoDB 定义——仅覆盖非系统集合。业务中若误配,可能导致对 system.views 等集合的意外放行或拦截。


















