目录
一、用户权限介绍
Mongodb中可以对用户进行读/写权限控制,主要有如下权限类型
权限类型(角色) | 说明 |
---|---|
read | 赋予用户指定数据库读权限 |
readWrite | 赋予用户指定数据库读写权限 |
dbAdmin | 赋予用户在指定数据库中执行管理函数权限,如索引创建、删除,查看 统计或访问 system.profile |
userAdmin | 赋予用户向 system.users 集合写入权限,可以在指定数据库里创建、删 除和管理用户 |
clusterAdmin | 赋予用户所有分片和复制集相关函数的 管理权限(admin库中可用) |
readAnyDatabase | 赋予用户所有数据库的读权限(admin库中可用) |
readWriteAnyDatabase | 赋予用户所有数据库的读写权限(admin库中可用) |
userAdminAnyDatabase | 赋予用户所有数据库的 userAdmin 权限(admin库中可用) |
dbAdminAnyDatabase | 赋予用户所有数据库的 dbAdmin 权限(admin库中可用) |
root | 超级管理员(admin库中可用) |
二、创建用户
2.1、创建管理员
对应用户管理员,通常只赋予用户操作权限,不授权DB的读写权限,所以授userAdminAnyDatabase
权限即可。
管理员账户必须在admin库
下创建,而MongoDB 3.0
版本后没有默认admin库
,需要先手动创建一个。
启动MongoDB后,在bin目录下执行./mongo
命令,进入客户端命令窗口。
2.1.1、创建admin库
执行use admin
> use admin
switched to db admin
2.1.2、在admin库创建用户
执行db.createUser()
可以创建用户,下面是执行语句格式
user
表示新建的用户名
pwd
表示用户密码
customData
表示存放一些用户相关的自定义数据(可选)
roles
是数组类型,表示给用户配置的权限
db.createUser({
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]
});
创建一个用户名为pandafox
,密码为123456
的用户管理员
> db.createUser({user:'pandafox',pwd:'123456',roles:[{role:'userAdminAnyDatabase',db:'admin'}]})
Successfully added user: {
"user" : "pandafox",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
2.1.3、查看用户
执行db.system.users.find()
,可以查看到用户相关信息
> db.system.users.find()
{ "_id" : "admin.pandafox", "userId" : UUID("22b25314-a601-43b1-af71-f0582f896ece"), "user" : "pandafox", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "9vErokSyPS2tGCeSnSsWzA==", "storedKey" : "vWezRfXwv/fd1vuK/tRKtBDGAWc=", "serverKey" : "4KvyD2348chlHPWehP40O+RZNQQ=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "rJiUl4MKauibSnNXH3md4twF1umLiNDCiH87Kg==", "storedKey" : "qVmeLILDx+D90lw3Rvx7kAdppeU65jEeJ2U919ghqvc=", "serverKey" : "FYb/OmXDZiuGUFo+avcNnv0iszncv6OHrOILLAl/h7c=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
2.1.4、开启用户验证
1)在mongodb.conf
配置文件中,增加auth
启动参数,并设置为true
[root@localhost etc]# cat mongodb.conf
dbpath=/usr/local/mongodb/data/db/
logpath=/usr/local/mongodb/log/mongodb.log
port=27017
fork=true
auth=true
2)重启MongoDB服务
2.1.5、效果验证
1)切换到admin库
,未登录情况执行命令,提示无权限,说明admin库已经授权用户成功
> use admin
switched to db admin
> db.system.users.find()
Error: error: {
"ok" : 0,
"errmsg" : "command find requires authentication",
"code" : 13,
"codeName" : "Unauthorized"
}
2)登录,使用db.auth('user','pwd')
,返回1
表示登录成功
> db.auth('pandafox','123456')
1
3)再次执行db.system.users.find()
会返回对应用户信息
2.2、创建普通用户
普通用户需要由管理员创建并授权。所以,我们首先做的就是用管理员账户登录数据库。
> use admin
switched to db admin
> db.auth('pandafox','123456')
1
2.2.1、创建test库
> use test
switched to db test
2.2.2、创建testfox用户
创建testfox
用户,密码为123456
,拥有test库
的读写权限
> db.createUser({user:'testfox',pwd:'123456',roles:[{role:'readWrite',db:'test'}]})
Successfully added user: {
"user" : "testfox",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}
2.2.3、效果验证
1)新开一个客户端,切换到test库,并登录
> use test
switched to db test
> db.auth('testfox','123456')
1
2)可见读写是ok的
> db.test.insert({name:'tom'})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5efbd7687e496edd01619a3d"), "name" : "tom" }
3)如果不登录是无法操作的
> db.test.insert({name:'tom'})
WriteCommandError({
"ok" : 0,
"errmsg" : "command insert requires authentication",
"code" : 13,
"codeName" : "Unauthorized"
})
三、修改用户
3.1、权限修改
使用 db.updateUser()
函数进行修改
> db.updateUser("pandafox",{roles:[{"role":"userAdminAnyDatabase","db":"admin"},{"role":"dbAdminAnyDatabase","db":"admin"}]})
> show users
{
"_id" : "admin.pandafox",
"userId" : UUID("22b25314-a601-43b1-af71-f0582f896ece"),
"user" : "pandafox",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "dbAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
3.2、密码修改
1)使用db.updateUser()
函数(有用户管理权限)
修改密码
db.updateUser('pandafox',{'pwd':'654321'})
断开连接,重新登录验证
> use admin
switched to db admin
> db.auth('pandafox','123456')
Error: Authentication failed.
0
> db.auth('pandafox','654321')
1
2)使用db.changeUserPassword()
函数(有用户管理权限)
修改密码
> db.changeUserPassword('pandafox','123456')
断开连接,重新登录验证
> use admin
switched to db admin
> db.auth('pandafox','654321')
Error: Authentication failed.
0
> db.auth('pandafox','123456')
1
四、删除用户
使用 db.dropUser()
函数删除用户,成功则返回true
> use test
switched to db test
> db.dropUser('testfox')
true
> show users
>