mongodb基于角色的权限模型(Role-Based Access Control)
我们直接用mongodb里的数据模型来说明
用户模型
user
{
roles: [
{
role: '<role>', // 内建 或者 用户定义 角色
db: '<database>' // 从其他数据库中指定角色
} | "<role>" // 文档 或者 字符串,字符串 <role> 表示从当前数据库中找角色
]
}
example:
{
roles: [ { role: "readWrite", db: "admin" }, "readWrite" ]
}
以上例子表示用户拥有来自 admin 的「readWrite」角色,和来自自身库的「readWrite」角色,注意权限是由 role 定义的,这两个角色的权限是不一致的
「readWrite」是一个数据库的「内建角色」 关于「内建角色」 https://docs.mongodb.com/manual/reference/built-in-roles/
可以通过命令 rolesInfo 查询到内建角色的权限
db.runCommand({
rolesInfo: 1,
showPrivileges:true,
showBuiltinRoles: true
})
角色模型
role
{
privileges: [
{
resource: {
db: '<database>',
collection: '<collection>'
},
actions: ["<action>", ... ] // 权限列表 https://docs.mongodb.com/manual/reference/privilege-actions/
}
],
roles: [{ role: "<role>", db: "<database>" } | "<role>"] // 指定权限继承的角色
}
关于resource的简单说明: db + collection 指定某个db的某个集合,如果值为 “”(空字符串) 表示「除系统外任何」 例如: { db: "products", collection: "inventory" } 指定 products 库的 inventory集合 { db: "", collection: "inventory" } 任何数据库的 inventory 集合 { db: "products", collection: "" } products 数据库的任何集合 { db: "", collection: "" } 任何数据库的任何集合
resource文档 https://docs.mongodb.com/manual/reference/resource-document/#resource-document
以上任何都不包括「系统集合」 关于「系统集合」 https://docs.mongodb.com/manual/reference/system-collections/
我们拿上面的「readWrite」角色举例,我们在运行 rolesInfo 命令之后(非admin库),大致能看到以下结果:
example:
{
"db" : "foodb", // 这个角色所属的数据库
"inheritedPrivileges" : [
...
],
"inheritedRoles" : [ ],
"isBuiltin" : true,
"privileges" : [
{
"actions" : [
"changeStream",
...
], // 权限列表
"resource" : {
"collection" : "", // 表示对所有的集合有以上权限
"db" : "foodb" // 表示作用于foodb
}
},
{
"actions" : [
"changeStream",
...
],
"resource" : {
"collection" : "system.js", // 系统集合
"db" : "foodb"
}
}
],
"role" : "readWrite", // 角色名
"roles" : [ ]
}
以上例子有部分省略,表达的是对于foodb有读写权限。 在admin库运行命令会有不同结果,大家不妨自己尝试一下。
实际使用
根据使用场景,首先定义出一个满足应用crud的角色 roleCommands文档 https://docs.mongodb.com/manual/reference/command/nav-role-management/
use admin
db.createRole(
{
role: "testRole",
privileges: [
{ resource: { db: "ding-group-task-service", collection: "" }, actions: ["find", "insert", "remove", "update"] },
],
roles: []
}
)
其中 find 是一系列查询命令的集合,这4个actions可以满足大部分应用的crud需求。 权限列表文档 https://docs.mongodb.com/manual/reference/privilege-actions/
接下来把这个角色赋予用户 userCommands文档 https://docs.mongodb.com/manual/reference/command/nav-user-management/
db.createUser({
user: 'test',
pwd: '123456',
roles: ["testRole"]
})
然后你可以通过这个用户 mongodb://test:123456@XXXX 登录,进行测试。