MongoDB用户权限管理
管理用户创建及使用
利用createUser
函数创建用户:
db.createUser({
user: "username",
pwd: "password",
roles: [
{
role: "authorityName",
db: "admin"
}
]
})
在createUser
函数中可使用的权限有如下几个:
权限 | 作用 |
---|---|
read | 允许用户读取指定数据库。 |
readWrite | 允许用户读写指定数据库。 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。 |
userAdmin | 允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户。 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限。 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限。 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 |
root | 只在admin数据库中可用。超级账号,超级权限。 |
首先确保MongoDB服务已经启动,进入MongoDB的命令行,并且切换到admin数据库:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> use admin
switched to db admin
添加权限为userAdminAnyDatabase的权限:
db.createUser({
user: "testUser",
pwd: "testPwd",
roles: [
{
role: "userAdminAnyDatabase",
db: "admin"
}
]
})
当出现如下提示信息时,代表创建成功:
Successfully added user: {
"user" : "testUser",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
然后重启MongoDB服务,在重启MongoDB服务时,可以在配置文件末尾处添加auth`参数,即以后的使用必须使用用户名和密码认证:
...其他配置信息省略,在配置文件末尾处添加:
# 必须先进行权限认证
auth = true
然后进入到MongoDB命令行(会话)中:
> use admin
switched to db admin
> db.auth("testUser", "testPwd")
1
输出1代表认证成功,0代表认证失败。
普通用户创建及使用
普通用户是指可在指定的数据库中进行操作的用户。
[root@VM-0-6-centos mongodb-4.4.6]# ./bin/mongo
MongoDB shell version v4.4.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3bef2e39-9e2a-4f4b-8d42-9b848f072872") }
MongoDB server version: 4.4.6
> db.auth("管理用户账号", "管理用户密码")
Error: Authentication failed.
0
进入MongoDB命令行后,如果没有切换指定数据库,而直接进行权限认证,结果会提示认证失败的消息。每一个数据库都有用户组,用户组中有多个用户,每一个用户的权限都可以是不一样的。
如果要添加普通用户,则需先认证admin数据库的用户:
> use admin
switched to db admin
> db.auth("管理用户账号", "管理用户密码")
1
对指定的数据库中添加一个普通用户:
> use training
switched to db training
> db.createUser({user:"training",pwd:"training",roles:[{role:"readWrite",db:"training"}]})
Successfully added user: {
"user" : "training",
"roles" : [
{
"role" : "readWrite",
"db" : "training"
}
]
}
如果当次会话中只认证了training数据库的用户,则无法使用show users
指令:
> use training
switched to db training
> db.auth("training", "training")
1
> show users
uncaught exception: Error: not authorized on training to execute command { usersInfo: 1.0, lsid: { id: UUID("69aeee09-7b51-47fc-a130-779b26626bd2") }, $db: "training" }
因此,要先对admin数据库进行认证才可以使用show users
指令。这也证明,没有对admin数据库进行认证,而后创建指定的数据库的用户是不可能的!
提示:如果当前会话中已经认证了除admin数据库之外的数据库的用户,再切换到admin数据库进行认证,使用管理用户可使用的指令时,会提示“logical sessions can't have multiple authenticated users”错误。因为一次会话连接不能认证多个用户的权限,所以需要退出当前会话,重新进入MongoDB命令行(会话),再对admin数据库进行认证。