赞
踩
上一篇 《MongoDB 单机安装部署》 文章中,为 MongoDB 配置了授权功能,当时只介绍了创建一个高权限账户,没有详细介绍 MongoDB 的权限相关的内容,本篇文章将详细 MongoDB 的权限控制。
MongoDB 权限控制是基于角色划分的,角色是一部分权限的组合。在创建用户时,需要指定用户所属的角色,一个用户可拥有多种角色,每个角色又可以包含多种权限。MongoDB 提供了多种默认角色,当然也支持用户自定义角色。
刚才提到 MongoDB 可以自定义角色,也为用户提供了部分默认角色。关于默认角色,不同的角色类型,它的作用范围也不一样,例如 readWrite 角色,它的作用范围就是一个特定的数据库。
读写权限的作用域是特定的数据库,默认角色又 read 和 readWrite 两种:
授权案例,为 test 库创建一个 test_user 用户,具有只读权限。
use test;
db.createUser({user: "test_user", pwd: "1234", roles: [{role: "read", db: "test"}]});
进行登陆测试。
mongo -utest_user -p1234 --authenticationDatabase test
MongoDB 提供以下默认的数据库管理角色:
前面介绍的角色,都作用于特定的数据库,接下来介绍的角色,可以作用于所有的数据库(local 与 config 数据库除外)进行管理和操作。
针对所有数据库(可以理解为所有由用户创建的数据库)进行管理操作的权限如下:
授权案例,创建一个全局只读的角色。
use admin;
db.createUser({user: "test_admin1", pwd: "1234", roles: [{role: "readAnyDatabase", db: "admin"}]});
使用全局的角色时 db 需要填写为 admin 负责会创建失败。
MongoDB 默认提供了一个 root 超级用户角色,当为一个用户分配 root 角色后,该用户将同时拥有刚才介绍的所有角色的权限,另外还有 clussterAdmin、restore、backup 的角色权限。
root 角色,创建示例:
use admin
db.createUser({user: "root",pwd: "admin123",roles: [{role: "root", db: "admin"}]})
本小节介绍如何对 MongoDB 中的用户进行管理,例如创建、删除、修改密码等。
查看数据库中所有的用户,可以使用如下命令:
db.getUsers();
授权案例,为 test 库创建一个 test_user 用户,具有只读权限。
use test;
db.createUser({user: "test_user", pwd: "1234", roles: [{role: "read", db: "test"}]});
通过执行如下命令,可以修改用户的角色。
db.grantRolesToUser()
例如,将刚才创建的 test_user 只有 read 角色,无法查看用户相关的信息:
myReplSet:PRIMARY> db.getUsers();
2024-02-20T16:08:50.236+0800 E QUERY [js] uncaught exception: Error: not authorized on test to execute command { usersInfo: 1.0, lsid: { id: UUID("3cd3d4c7-cc42-447d-b782-b2773b7193c2") }, $clusterTime: {
使用高权限账户,为其添加一个 userAdmin 角色:
db.grantRolesToUser( "test_user", [{role: "userAdmin", db: "test"}])
再次使用 test_user 查看用户相关信息,没有报错:
>>> mongo -utest_user -p1234 --authenticationDatabase test
MongoDB shell version v4.2.25
myReplSet:PRIMARY> db.getUsers()
[
{
"_id" : "test.test_admin",
"userId" : UUID("753e07d3-7f32-4f69-b53a-10a0d33d0d02"),
"user" : "test_admin",
"db" : "test",
"roles" : [
{
"role" : "dbAdmin",
"db" : "test"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
]
删除单个用户的语法如下:
db.dropUser("username")
删除一个 db 下,所有的用户:
use test;
db.dropAllUsers();
例如,将 user123 用户密码修改为 112233 的语法如下:
db.updateUser("user123",
{
pwd: '112233'
}
)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。