一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何为MongoDB用户授予查询权限?

时间:2026-08-10 10:17:48 编辑:袖梨 来源:一聚教程网

直接为用户分配指定数据库的read角色是最常见且安全的单库只读配置方式,必须use目标库后执行db.createUser并明确指定{role:"read",db:"test"},连接时需通过--authenticationDatabase指定认证库,否则认证失败。

直接给用户加 read 角色即可,但必须指定数据库,且不能跨库生效。

用 read 角色授予单库只读权限

这是最常见、最安全的查询权限配置方式。用户只能对指定数据库执行 findcountdistinct 等读操作,无法写入或删改。

  1. 必须先 use 到目标数据库再执行 db.createUser(),否则角色会绑定到当前库(比如误在 admin 库里创建,却想控制 test 库)
  2. roles 数组里要明确写 { role: "read", db: "test" },不能只写 "read"
  3. 如果用户还需访问其他库的只读数据,得额外加一条 { role: "read", db: "report" },MongoDB 不自动继承
  4. 示例:
    use testdb.createUser({user: "reporter",pwd: "secret123",roles: [{ role: "read", db: "test" }]})

避免误用 readAnyDatabase 导致权限过大

这个角色看起来“方便”,但实际风险极高:它允许用户读取所有数据库(包括 adminconfiglocal),可能泄露系统元数据或备份凭证。

  1. readAnyDatabase 只能在 admin 库中创建,且需用户已通过 admin 认证
  2. 除非是 BI 工具专用账号且严格限制网络来源(配合 authenticationRestrictions),否则不建议启用
  3. 替代方案更可控:为每个业务库单独创建 read 用户,或用自定义角色限定集合级权限

连接时必须指定 authenticationDatabase

用户凭证存在哪个库,就得告诉客户端——否则即使密码正确也会报 Authentication failed

  1. 如果用户建在 test 库:mongo -u "reporter" -p "secret123" --authenticationDatabase "test"
  2. 如果用户建在 admin 库(比如超级只读账号):--authenticationDatabase "admin"
  3. db.auth() 方式登录时,也得先 use 到对应库:
    use testdb.auth("reporter", "secret123")
  4. 遗漏 --authenticationDatabase 是生产环境最常见的连接失败原因

真正麻烦的不是加权限,而是搞错角色作用域和认证库——这两个点一旦出错,日志里只显示模糊的 unauthorized 错误,排查起来反而比写代码还费时间。

热门栏目