直接为用户分配指定数据库的read角色是最常见且安全的单库只读配置方式,必须use目标库后执行db.createUser并明确指定{role:"read",db:"test"},连接时需通过--authenticationDatabase指定认证库,否则认证失败。
直接给用户加 read 角色即可,但必须指定数据库,且不能跨库生效。
这是最常见、最安全的查询权限配置方式。用户只能对指定数据库执行 find、count、distinct 等读操作,无法写入或删改。
use 到目标数据库再执行 db.createUser(),否则角色会绑定到当前库(比如误在 admin 库里创建,却想控制 test 库)roles 数组里要明确写 { role: "read", db: "test" },不能只写 "read"
{ role: "read", db: "report" },MongoDB 不自动继承use testdb.createUser({user: "reporter",pwd: "secret123",roles: [{ role: "read", db: "test" }]})
这个角色看起来“方便”,但实际风险极高:它允许用户读取所有数据库(包括 admin、config、local),可能泄露系统元数据或备份凭证。
readAnyDatabase 只能在 admin 库中创建,且需用户已通过 admin 认证authenticationRestrictions),否则不建议启用read 用户,或用自定义角色限定集合级权限用户凭证存在哪个库,就得告诉客户端——否则即使密码正确也会报 Authentication failed。
test 库:mongo -u "reporter" -p "secret123" --authenticationDatabase "test"
admin 库(比如超级只读账号):--authenticationDatabase "admin"
db.auth() 方式登录时,也得先 use 到对应库:use testdb.auth("reporter", "secret123")
--authenticationDatabase 是生产环境最常见的连接失败原因真正麻烦的不是加权限,而是搞错角色作用域和认证库——这两个点一旦出错,日志里只显示模糊的 unauthorized 错误,排查起来反而比写代码还费时间。