权限概述
Mongodb用role来划分规则,角色是将一些权限组成一个集合,然后再将该集合授权给某个用户,某个用户就拥有一些列的权限。MysQL5.7版本还不支持role的配置,8.0开始支持role。
安装 MongoDB 时,会自动创建 admin 数据库,这是一个特殊数据库,提供了普通数据库没有的功能。有些用户角色赋予用户操作多个数据库的权限,而这些角色只能在 admin 数据库中创建,要创建有权操作所有数据库的超级用户,必须将该用户加入到 admin 数据库中。连接验证时,MongoDB 将在指定数据库和 admin 数据库中检查用户账户。
注意:
mongodb语句大小写敏感。
不要在admin库下,创建表业务表。
系统权限介绍
权限名称 | 权限介绍 | 角色类型 | 备注 |
---|---|---|---|
read | 该角色拥有读取指定数据库 | 用户角色 | 系统集合以及system.indexes,system.js,system.namespaces集合除外 |
readWrite | 该角色拥有读写指定数据库 | 用户角色 | 系统集合和system.js集合除外 |
dbAdmin | 该角色拥有指定数据库数据库管理权限,包括 system.indexes,system.namespaces, system.profile集合的操作权限。 | 管理角色 | 该角色不拥有所有非系统集合的读权限 |
dbOwner | 该角色拥有指定数据库的所有权限,该角色包括:readWrite、dbAdmin、userAdmin | 管理角色 | |
userAdmin | 该角色拥有指定数据库用户和角色的管理权限。包括创建用户等。 | 管理角色 | |
clusterAdmin | 该角色拥有群集的所有权限。该角色包含clusterManager,clusterMonitor,hostManager 角色权限,同时还有删除数据库的权限 | 群集管理角色 | 只能创建在admin库下 |
clusterManager | 该角色拥有群集的管理和监控权限,包括对local、config数据库的访问权限,同时该角色拥有分片和复制集的管理权限 | 群集管理角色 | 只能创建在admin库下 |
clusterMonitor | 该角色拥有群集的监控权限 | 群集管理角色 | 只能创建在admin库下 |
hostManager | 该角色拥有群集的监控和服务管理权限 | 群集管理角色 | 只能创建在admin库下 |
backup | 该角色拥有备份数据的权限 | 备份还原角色 | 只能创建在admin库下 |
restore | 该角色拥有还原备份数据的权限。 | 备份还原角色 | 只能创建在admin库下 |
readAnyDatabase | 该角色拥有所有数据库的读权限 | 所有数据库角色 | 只能创建在admin库下 |
readWriteAnyDatabase | 该角色拥有所有数据库的读写权限 | 所有数据库角色 | 只能创建在admin库下 |
userAdminAnyDatabase | 该角色拥有所有数据库的userAdmin权限 | 所有数据库角色 | 只能创建在admin库下 |
dbAdminAnyDatabase | 该角色拥有所有数据库的dbAdmin权限。 | 所有数据库角色 | 只能创建在admin库下 |
root | 赋予超级账号,超级权限 | 超级权限角色 | 只能创建在admin库下,该角色跳出五行中,不在三界内,慎用 |
1.创建用户
用户创建语法:
{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
user字段:用户的名字;
pwd字段:用户的密码;
cusomData字段:为任意内容,例如可以为用户全名介绍;
roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色;
roles 字段:可以指定内置角色和用户定义的角色。
用户名是read的用户,密码是read,对test01库下有只读操作。
db.createUser(
{
user: "read",
pwd: "read",
roles: [ { role: "read", db: "test01" } ]
}
)
注意:
创建管理员角色用户的时候,必须到admin下创建。
创建普通库的用户时,删除的时候也要到相应的库下操作。
只有只读或者读写角色,没有只写角色。
2.新增权限
给read用户新增对test02库有只读权限
db.grantRolesToUser( "read", [{'role':'read','db':'test02'}])
3.回收用户权限
use test
db.revokeRolesFromUser ( "read",[ { role : "read", db :"test02"} ] )
4.删除用户
方法1:
use admin
db.system.users.remove({user:"read"})
方法2:
use admin
db.dropUser("read")
5.查看用户权限
方法1:
use admin
show user
方法2:
use admin
db.system.users.find().pretty()
6.错误示例
将readAnyDatabase建在非admin库下
在test01库下,创建对任何库可读的read01用户,发现报错,报错信息如下。
mongo>
mongo> db.auth('root','123456')
1
mongo>
mongo> db.createUser(
... {
... user: "read01",
... pwd: "123456",
... roles: [ { role: "readAnyDatabase", db: "test01" } ]
... }
... )
2019-09-01T19:46:54.083+0800 E QUERY [thread1] Error: couldn't add user: No role named readAnyDatabase@test01 :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1290:15
@(shell):1:1
mongo>
注意:以下角色都必须在admin库下创建。
clusterAdmin
clusterManager
clusterMonitor
hostManager
backup
restore
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase
root
用户在哪个数据库下创建的,则在什么用户下验证,一般建议在admin库下创建
在test01库下,创建read02用户,该用户只对test01库有只读权限,在read02用户只能在test01库下验证,无法在其他库下验证。
mongo> use test01
switched to db test01
mongo> db.createUser(
... {
... user: "read02",
... pwd: "123456",
... roles: [ { role: "read", db: "test01" } ]
... }
... )
Successfully added user: {
"user" : "read02",
"roles" : [
{
"role" : "read",
"db" : "test01"
}
]
}
mongo>
mongo>
mongo> use test02 ###在test02库下验证,报错
switched to db test02
mongo> db.auth('read02','123456')
Error: Authentication failed.
0
mongo> use test01 ###在test01库下验证,成功
switched to db test01
mongo>
mongo> db.auth('read02','123456')
1
mongo>
mongo> show tables;
test_col
mongo>
创建对不同库的权限的用户
创建read03用户,该用户对test01只读,对test02只能写,发现报错。原因是mongo没有只写角色,只有读写角色,改为对test02库可读可写,发现用户创建成功。
mongo> use admin
switched to db admin
mongo> db.auth('root','123456')
1
mongo>db.createUser (
... {
... user : "read03",
... pwd : "123456",
... roles : [ { role : "read", db : "test01" },
... { role : "write", db : "test02" }
... ]
... }
... )
2019-09-01T20:19:44.768+0800 E QUERY [thread1] Error: couldn't add user: No role named write@test02 :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1290:15
@(shell):1:1
mongo>
mongo>
mongo> db.createUser (
... {
... user : "read03",
... pwd : "123456",
... roles : [ { role : "read", db : "test01" },
... { role : "readWrite", db : "test02" }
... ]
... }
... )
Successfully added user: {
"user" : "read03",
"roles" : [
{
"role" : "read",
"db" : "test01"
},
{
"role" : "readWrite",
"db" : "test02"
}
]
}
mongo>
7.常见用户管理函数
###密码验证
db.auth() :Authenticates a user to a database.
###创建用户
db.createUser() :Creates a new user.
###修改用户权限
db.updateUser() :Updates user data.
###修改用户密码
db.changeUserPassword() :Changes an existing user’s password.
###删除所有用户
db.dropAllUsers() :Deletes all users associated with a database.
###删除用户
db.dropUser() :Removes a single user.
###给用户赋予权限
db.grantRolesToUser() :Grants a role and its privileges to a user.
###回收用户权限
db.revokeRolesFromUser() :Removes a role from a user.
###查看某个用户权限
db.getUser("指定 username") :Returns information about the specified user.
###查看所有用户权限
db.getUsers() :Returns information about all users associated with a database
8.开启验证
修改mongo配置文件
在配置文件中加上authorization: "enabled"
,不开启验证,登陆mongo不需要密码。
[root@192-168-0-171 mongodb]# cat mongodb.yml
。。。
security:
keyFile: "/opt/soft/mongodb/key/mongodb-keyfile"
clusterAuthMode: "keyFile"
authorization: "enabled"
。。。