不起床是我最后的倔强
单实例情况
这里只针对3.x版本说明
官方文档
首先看文档
MongoDB provides support for authentication and authorization on a per-database level. Users exist in the context of a single logical database.
- MongoDb提供的权限控制是数据库级别的,每个数据库都有属于自己的管理者帐号 。
- 例如,有两个db A和B,在A中的用户UserA,在B中是不存在的。
数据库安装完成时,启动服务(第一次一般不加auth参数)。
./mongod
- 初次登录只有local库
- 默认登录的test库(其实test库不存在),并且admin库是不存在的(之前版本有)。
- 此时登录,由于启动服务时没有加auth参数,所以是没有用户权限控制的。
- 登录者现在是可以对数据库做任何操作的,就是说这个数据库连接对当前数据库有完整权限。
启用用户权限
admin库是存放数据库账号信息的
admin库说明
- system.version存储authSchema的版本信息
- system.users存储了数据库账号信息
- system.roles存储了角色信息(如果用户有自定义角色)
- system.users、system.roles2个集合的数据,MongoDB会cache在内存里,这样不用每次鉴权都从磁盘加载用户角色信息
if (supportsDocLocking() || enableCollectionLocking) {
if (supportsDocLocking() || enableCollectionLocking) {
// The check for the admin db is to ensure direct writes to auth collections
// are serialized (see SERVER-16092).
if (_id == resourceIdAdminDB && !isRead) {
_mode = MODE_X;
}
_lockState->lock(_id, _mode);
}
从代码中我们可以看出,MongoDB将将admin数据库上的意向写锁(MODE_IX)直接升级为写锁(MODE_X),也就是说admin数据库的写入操作的锁级别只能到DB级别,不支持多个collection并发写入,在写入时也不支持并发读取。如果用户在admin数据库里存储业务数据,则可能遭遇性能问题。
admin库操作
首先要理解:
- admin库不可以直接管理其它数据库的权限,但是可以通过创建用户来间接管理。
- mongodb是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
- 切换到admin数据库,添加的账号才是管理员账号。
- 用户只能在用户所在数据库登录(db.auth()),包括管理员账号。
- 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证(登录)后才可以。
如果此时想启用用户权限:
切换到admin库(此时admin库不存在)
use admin //切换数据库
db.createUser({
user:"king",
pwd:"king",
roles:[{
"role":"userAdminAnyDatabase","dbAdminAnyDatabase","db":"kingDb"
}]
})
- 这样管理员就创建完毕了。可以用这个用户创建维护其他数据库的用户。
- 随着用户的创建,admin数据库此刻也成功创建了。
登出数据库,重启数据库
./mongod --auth //启动用户权限
use admin //切换数据库
db.auth("king","king") //其实就是数据库登录
还有要说明:
- 要创建哪个数据库的object(包括用户),首先要切换到目标数据库
- 在哪个库(admin)创建的用户就要在哪个库做验证(db.auth),验证通过后再切换其它库操作
use kingDb //切换数据库
db.createUser({ //利用admin创建kingDb数据库的用户
user:"kingAdmin",
pwd:"king",
roles:[{
"role":"userAdminAnyDatabase","dbAdminAnyDatabase","db":"kingDb"
}]
})
db.auth("kingAdmin","king") //用新建的用户登录
角色说明
Built-In Roles(内置角色):
- 数据库用户角色:
- read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- 数据库管理角色:
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- dbOwner:
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- 集群管理角色:
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
- clusterManager:
- clusterMonitor:
- hostManager:
- 备份恢复角色:
- backup:
- restore:
- 所有数据库角色:
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
- 超级用户角色:
- root :只在admin数据库中可用。超级账号,超级权限
- 这里还有几个角色间接或直接提供了系统超级用户的访问(
- dbOwner :
- userAdmin:
- userAdminAnyDatabase:
- 内部角色
- __system: