理解admin数据库
安装MongoDB时,会自动创建admin数据库,这是一个特殊的库。有些用户账户角色赋予用户操作多个数据库的权限,而这些用户只能在admin数据库中创建。要创建有权操作所有数据库的超级用户,必须将该用户加入到admin数据库中。检查凭证时,MongoDB将在指定数据库和admin数据库中检查用户账户。
管理用户账户
在MongoDB shell中,可添加、删除和配置用户。
创建用户账户
数据库管理的一个重要部分是创建能够管理用户和数据库以及读写数据库的用户账户。
创建一个数据库新用户用db.createUser()方法,如果用户存在则返回一个用户重复错误。
db.createUser(user, writeConcern)
user: 这个文档创建关于用户的身份认证和访问信息。
writeConcern: 这个文档描述保证MongoDB提供写操作的成功报告。
user文档,定义了用户的以下形式
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]
}
user文档字段介绍
user |
独一无二的用户名 |
pwd | 用户的密码 |
cusomData | 为任意内容,例如可以为用户全名介绍 |
roles | 指定用户的角色,可以用一个空数组给用户设定空角色 |
在roles字段,可以指定内置角色和用户定义的角色。
内置角色(Built-In Roles)
内置角色是MongoDB预定义的角色,操作的资源是在DB级别上。MongoDB拥有一个SuperUser的角色:root,拥有最大权限,能够执行任意操作。
数据库用户角色(Database User Roles):
- read:授予User用户只读权限
- readWriter:授予User用户读写权限
数据库管理角色(Database Administration Riles):
- dbAdmin:在当前DB中执行管理操作
- adOwner:在当前DB中执行任意操作
- userAdmin:在当前DB中管理用户
集群管理角色(Cluster Administration Roles):
- clusterAdmin:授予管理集群的最高权限
- clusterManager:授予管理和监控集群的权限
- clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
- hostManager:管理Server
备份恢复角色(Backup and Restoration Roles):
- backup
- restore
所有数据库角色(All-Database Roles):
- readAnyDatabase:授予在所有数据库上读取数据的权限
- readWriterAnyDatabase:授予在所有数据库上读取数据的权限
- userAdminAnyDatabase:授予在所有数据库上管理用户的权限
- dbAdminAnyDatabase:授予管理所有数据库的权限
writeConcern文档
- w选项:允许的值分别是 1、0、大于1的值、"majority"、<tag set>;
- j选项:确保mongod实例写数据到磁盘上的journal(日志),这可以确保mongd以外关闭不会丢失数据。设置true启用。
- wtimeout:指定一个时间限制,以毫秒为单位。wtimeout只适用于w值大于1。
实例
在admin数据库中创建一个管理员用户。
use admin
db.createUser( { user: "testadmin",
pwd: "",
roles:[ "dbAdmin" ] } );
如图表示添加成功。
列出用户
在每个数据库中,用户账户都存储在集合db.system.users中。要获取用户列表,可以使用两种不同的方法。
方法一:
切换到要列出其用户账户的数据库,再执行命令show users。
use admin
show users
方法二:
切换到要列出其用户账户的数据库,对集合db.system.users执行find等查询。db.system.users.find()返回一个游标对象,可以用它来访问User文档。
var cur = db.system.users.find()
cur.count()
cur.toArray()
如图不光可列出用户,还可调用 count() 方法显示出有几个用户。
删除用户
要将用户从MongoDB数据库中删除,可使用方法 dropUser(<username>)。
实例
删除之前演示中在 admin 数据库中创建的 testadmin。
use admin
db.dropUser("testAdmin")
配置访问控制
MongoDB提供了数据库级身份验证和授权,这意味着用户账户存在与单个数据库中。为支持基本的身份验证,MongoDB在每个数据库中都将用户凭证存储在集合system.users中。
MongoDB安装后,数据库admin中没有任何用户账户,此时MongoDB向从本地主机发起的连接提供全面的数据库管理权限。配置MongoDB时,首先需要创建用户管理员账户和数据库管理员账户。用户管理员账户可在admin和其他数据库中创建用户账户。数据库管理员账户可作为管理数据库、集群、复制和MongoDB其他方面的超级用户。
注意:
用户管理员账户和数据库管理员账户都是在admin数据库中创建的。
创建用户管理员账户
用户管理员应只有创建用户账户的权限,而不能管理数据库或执行其他管理任务。
用户管理员的角色应为 userAdminAnyDatabase,这可以让用户管理员能够新建用户账户,但不能对数据库执行其他操作。
use admin
db.createUser( { user: "userAdmin",
pwd:"",
roles: [ "userAdminAnyDatabase" ] } )
启用身份验证
创建用户管理员账户后,使用参数--auth重启MongoDB服务器,也可在配置文件中指定auth设置。
mongod -dbpath <mongo_data_location>/data/db -auth
或配置文件
配置完成后,再想从MongoDB shell访问MongoDB服务器管理用户时,必须向数据库验证身份,不然没有权限管理用户。
可以执行下面的命令向admin数据库验证身份。
use admin
db.auth("userAdmin","123456")
或在启动MongoDB shell 时使用选项 --username和--password 向数据库admin验证身份。
mongo --username "userAdmin" --password ""
创建数据库管理员账户
数据库管理员的角色应为 readWriteAnyDatabase、dbAdminAnyDatabase 和 clusterAdmin 。这让这名用户能够访问系统中所有数据库、创建新的数据库以及管理MongoDB集群和副本集。
use admin
db.createUser( { user: "dbadmin",
pwd:"",
roles: [ "readWriteAnyDatabase","dbAdminAnyDatabase","clusterAdmin" ] } )
注意:用户管理员没有权限通过MongoDB shell关闭mongod服务器,必须切换到数据库管理员账户才可关闭mongod服务器。