分类: MongoDB

MongoDB用户角色权限认证说明

MongoDB用户权限设置逻辑:先初始化一个超级管理员,然后让这个超管用户,创建普通用户和角色,并给用户分配角色,同时也有一些内建的角色可以使用。

  1. MongoDB是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
  2. 切换到admin数据库,添加的账号才是管理员账号,添加普通用户,需先打开对应的库在添加,否则就添加到admin里面去了;
  3. 用户只能在用户所在数据库登录,包括管理员账号。
  1. 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。
    默认auth配置是关闭,启动mongod服务,并在本机(即localhost)使用mongo连接到数据库:

use admin;
db.createUser({

user: "master", // 这个名字可以随便取
pwd: "testpw",
roles: [
    {
        role: "userAdminAnyDatabase",
        db: "admin"
    }
]

});

// 系统管理,role是root。这个权限很牛,跟linux的root一样牛,除了system系统相关的集合,其他都能任意读写。
// root可以在一开始创建,也可以被master创建。
// master就相当于可以任免CEO的人事部经理,但也只是一个人事部经理。
db.createUser({

user: 'root', // 这个名字可以随便取
pwd: 'testpw',
roles: [
    {
        role: 'root',
        db: 'admin'
    }
]

});

db.auth('root','testpw'); //验证用户是否生效
db.system.users.find(); //查询所有用户
添加完管理员权限以后记得开启auth=true参数,出去mongodb生效;

添加普通用户:赋予多个库的读写权限:
现在用master给其他db分配账号,假设现在有一个news项目,下边有articles,categories,comments,ads四个db
use news;
db.createUser({

user: 'news',
pwd: 'testpw',
roles:[
    { role: 'read', db: 'articles' }, // 只有读权限
    { role: 'read', db: 'categories' },
    { role: 'read', db: 'comments' },
    { role: 'readWrite', db: 'ads' }, // 有读写权限
]

});

db.dropUser(name) # 删除用户
db.dropAllUsers() # 删除当前db下所有用户
db.system.users.find(); //查询当前库下所有用户
db.getUser(name) # 获取当前db下指定用户的权限信息
db.getUsers() # 获取当前db下所有用户的权限信息

MongoDB角色
内建的角色
数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
内部角色:__system
角色说明:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
更多参考:https://docs.mongodb.com/manual/reference/built-in-roles/#built-in-roles

userAdminAnyDatabase、root、read、readWrite都是mongo内建的role,你能在这里找到所有的内建角色, 以及所有的操作。角色其实就是一系列操作的总称,mongo对操作分得极细,所以如果内建role不能满足业务的时候,可以自建角色:
新建一个role
db.createRole({

role: 'rolename',
privileges: [
    {
        resource: { db: 'articles', collection: 'magazine' }, # 能精确控制到集合
        actions: ['find', 'update', 'insert', 'remove']
    }
],
roles: [ # 从这些role中继承
    { role: 'read', db: 'admin'}
]

})
更新role,参数和新建一样,更新会完全覆盖之前记录
db.upadteRole()
db.dropRole(rolename) # 删除一个role
db.dropAllRoles() # 删除当前db下所有role
给role添加操作
db.grantPrivilegesToRole(rolename, [{

resource: {db: 'comments'}, actions: ['read']

}])
给role取消操作
revokePrivilegesFromRole(rolename, [{

resource: {db: 'comments'}, actions: ['read']

}])
db.grantRolesToRole(rolename, (array)roles) # 合并role,也可以理解为继承,把多个role的职责归于一身
db.revokeRolesFromRole(rolename, (array)roles) # 与上一条相反,移除另一个role所拥有的权限
db.getRole(rolename) # 查看指定role权限
db.getRoles() # 查看当前db所有自定义role的权限
参考文档:
https://docs.mongodb.com/manual/reference/method/db.createUser/
https://docs.mongodb.com/manual/reference/security/

相关文章

此处评论已关闭