如果对你有帮助, 请点击喜欢鼓励一下我这个臭弟弟
需求由来
和其他公司对接, 需要访问特定的数据, 提供视图对方不能访问[不知道是驱动的事儿还是框架的事儿, 对方未能提供足够信息进行排查]. 这种情况下, 采取限制对方公司角色读取单表数据的措施来曲线救国.
MongoDB内置数据库用户角色
read, readWrite
实现控制collection-level的访问控制, 就是在内置角色的基础上增加对集合操作的权限控制, 创造一个新的角色. 然后新增用户分配此角色.
创建新角色
use admin;
db.auth("admin", "xxx");
db.createRole(
{
role: "<角色名>",
privileges: [{
resource: {
db: "<数据库名>",
collection: "<集合名>"
},
actions: ["find"]
}],
roles: [{
role: "read",
db: "admin"
}]
}
);
上面的命令执行完之后, 在admin数据库上创建了一个新角色, 这个角色继承自read角色, 对于数据库的指定集合只能执行find操作. roles是必选项.
实际的例子如下:
db.createRole(
{
role: "testRole",
privileges: [{
resource: {
db: "testDB",
collection: "testCollection"
},
actions: ["find"]
}],
roles: [{
role: "read",
db: "admin"
}]
}
);
效果就是创建了一个testRole角色, 如果创建用户分配此角色的话, 只能查询testDB.testCollection的数据, 不能执行其他操作.
创建用户, 分配testRole角色
db.createUser({user:'testUser',pwd:'123',roles:[{role:'testRole',db:'admin'}]})
实际效果
use admin;
db.auth("testUser", "123");
use testDB;
db.testCollection.find(); // 结果正常显示
db.device.find(); // 访问权限之外的集合提示未授权
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on birdnest to execute command { find: \"device\", filter: {}, lsid: { id: UUID(\"4a5d2a88-6d99-4839-a59c-955d77a5a564\") }, $db: \"testDB\" }",
"code" : 13,
"codeName" : "Unauthorized"
}
如果对你有帮助, 请点击喜欢鼓励一下我这个臭弟弟