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数据库进行认证。

posted @ 2022-09-23 13:43  GaoYanbing  阅读(414)  评论(0编辑  收藏  举报