MongoDB限制访问单表

如果对你有帮助, 请点击喜欢鼓励一下我这个臭弟弟

需求由来

和其他公司对接, 需要访问特定的数据, 提供视图对方不能访问[不知道是驱动的事儿还是框架的事儿, 对方未能提供足够信息进行排查]. 这种情况下, 采取限制对方公司角色读取单表数据的措施来曲线救国.

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"
}                       

如果对你有帮助, 请点击喜欢鼓励一下我这个臭弟弟

你可能感兴趣的:(MongoDB限制访问单表)