MongoDB自定义权限实现MongoDB集合即表权限管理
背景
业务上做迁移需要对原有数据进行锁定防止新数据写入,锁定的是db里的一个集合,MongoDB没有MySQL的权限细化管理到表,翻遍MongoDB文档,只能自建角色。
官方文档
用户自定义角色
https://docs.mongodb.com/manual/core/security-user-defined-roles/#user-defined-roles
创建角色语法
https://docs.mongodb.com/manual/reference/method/db.createRole/#db.createRole
创建自定义角色
在业务库里执行
use db_name // db_name这里是你业务数据库的名称
db.createRole(
{
role: "my_define_role", // 角色名称
privileges: [
{ resource: { cluster: true }, actions: [ "addShard" ] }, // 分片集群MongoDB需要填写此项,副本集不用
{ resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert", "remove" ] }, // 定义库权限,可以到集合权限。
{ resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert", "remove" ] }, // // 多个集合可以分别指定
{ resource: { db: "", collection: "" }, actions: [ "find" ] }
], // 也可以指定不同的库,""表示所有库、集合
roles: [
{ role: "read", db: "db_name" } // db_name这里是你业务数据库的名称
]
},
{ w: "majority" , wtimeout: 5000 } // 副本集默认的写入方式是majority
)
相关文档
https://docs.mongodb.com/manual/reference/write-concern/#writeconcern.%22majority%22
更新业务库角色权限
db.getSiblingDB("db_name").updateUser( // db_name为业务库名
"db_name",
{
customData: {},
roles: [
{ "role": "my_define_role", "db": "db_name" ,},// my_define_role为自定义角色名
],
}
)
完