十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
MongoDB权限管理基础概念
概念解释
1.数据库用户角色
read:该角色拥有数据的只读权限,系统集合以及system.indexes,system.js,system.namespaces集合除外。
readWrite:该角色拥有对应数据库的读写权限,系统集合和system.js集合除外。
2.数据库管理角色
dbAdmin:该角色拥有指定数据库数据库管理权限,包括 system.indexes, system.namespaces, system.profile集合的操作权限。该角色不拥有所有非系统集合的读权限。
dbOwner:该角色拥有指定数据库的所有权限,该角色包括:readWrite、dbAdmin、userAdmin。
userAdmin:该角色拥有指定数据库用户和角色的管理权限。包括创建用户等。
3.群集管理角色
clusterAdmin:该角色拥有群集的所有权限。该角色包含clusterManager,clusterMonitor,hostManager 角色权限。同时还要删除数据库的权限。
clusterManager:该角色拥有群集的管理和监控权限,包括对local、config数据库的访问权限。同时该角色拥有分片和复制集的管理权限。
clusterMonitor:该角色拥有群集的监控权限。
hostManager:该角色拥有群集的监控和服务管理权限。
//注意:这些角色只能在Admin数据库下创建
4.备份还原角色
backup:该角色拥有备份数据的权限。
restore:该角色拥有还原备份数据的权限。
//注意:这些角色只能在Admin数据库下创建
5.所有数据库角色
该分类下面的角色权限和数据库角色权限一样,区别在于它拥有的是所有数据库的权限而不是指定数据库下的权限。但是不拥有system.*相关集合、local、config数据库的权限。
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase
//注意:这些角色只能在Admin数据库下创建
6.超级权限角色
root:该角色拥有所有权限,该角色包含readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin roles, restore, and backup角色。
注意:该角色只能在创建在Admin库中
7.内部角色
__system:该角色为系统内部角色,比如复制集成员、mongos使用。
作为一家“创意+整合+营销”的成都网站建设机构,我们在业内良好的客户口碑。创新互联公司提供从前期的网站品牌分析策划、网站设计、做网站、网站建设、创意表现、网页制作、系统开发以及后续网站营销运营等一系列服务,帮助企业打造创新的互联网品牌经营模式与有效的网络营销方法,创造更大的价值。
参考链接:我们需要整理小结一下,整个流程
MongoDB 4.X 用户和角色权限管理总结
https://www.cnblogs.com/dbabd/p/10811523.html
//完全参照此链接 可行
小结如下:
1、谨记:先在不开启认证的情况下,创建用户,之后关闭服务,然后再开启认证,才生效。
2、我们正常的搭建mongodb,然后在创建自定义角色
(在admin数据库中创建自定义用户dbabd,对集合city有find,update权限,对集合user_operation只有find权限。)
//我的猜想,我们可以不创建这个 后面进行验证
3、用户,必须先创建“创建用户管理的用户”
//启用访问控制登录之前,首先需要在admin数据库中创建角色为userAdmin或userAdminAnyDatabase作为用户管理的用户,之后才能通过这个用户创建其它角色的用户,这个用户作为其它所有用户的管理者。
4、开启访问控制,在这里我们在启动 mongodb的时候加上--auth (注意,我们在配置文件中加auth=true的时候没有成功)
//[root@prd3-MySQL-0-36 ~]# mongod -f /ivargo/app/mongodb/conf/mongo.conf --auth
5、用户管理用户验证 可以使用我们创建的管理用户的用户去登录 ,在这里就是user_admin 这个用户去登录
//可以理解为 是目前mongodb的最高权限者
6、接下来,才是创建一个普通用户,给他某个库的可读,可写的权限
//也就是说,必须要自己先创建一个管理普通用户的用户,然后在登录到这个管理用户的用户下 去创建文明想要创建的用户。
7、创建好了普通用户,之后,就是为用户添加角色(我的理解,角色就是权限的意思)
比如 为用户dbabd_user添加dbabd数据库的read角色(权限)。
接下来,我们可以根据我写的小结,再次的实验一次
上面的测试中创建管理用户用户名 的角色为 userAdminAnyDatabase 他的权限分配为:可以在指定数据库创建和修改用户(除了数据库config和local之外)。
如果是root的角色的话,那么就是超级最大的权限 ,我们下面试一下,最高的root权限
// 创建管理用户用户名为user_admin,密码admin
db.createUser(
{
user: "user_admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
//总结
use admin
switched to db admin
db.system.users.find()
{ "_id" : "admin.user_admin", "user" : "user_admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "YVnHB6u4l4kxyVkAG9h7bQ==", "storedKey" : "u0bVa7oIMBQpyD8vzv9HQHAHBGk=", "serverKey" : "XE9j9YQKKWi8/1CdXchLWILs6Ds=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "q1riE6iDxYrY3ROeVAw59q8DXg47B5DeGxtw6w==", "storedKey" : "OVbdZPfC7CsmHGZKKiW2jH50cqMgPX8OfTgfcTg3MXM=", "serverKey" : "0TjC2lObSJ7lmzwTMNXWWeG6leHLpzK9n+VReDUrKEs=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
{ "_id" : "admin.dbabd_user", "user" : "dbabd_user", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "Uvls4hIsjxHctMK8etQRQA==", "storedKey" : "/KAF4Zl7nOmeMEy+UBnpLVNPhvw=", "serverKey" : "/g85OaGcrfWAfisbllqAdqjUTP8=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "vCoqeEVfao5T6Rv6dMlw7J6zDFU0KoqDjRxXyA==", "storedKey" : "IL1NENjImUYXiRuxxSA3uz4ein8OPNx/VJZVag0BcV0=", "serverKey" : "GCRyzJ8siZEgAL6qURfuY4GQn7VYz4+o2PmtmT4rqmc=" } }, "customData" : { "info" : "user for dbabd" }, "roles" : [ { "role" : "read", "db" : "dbabd" }, { "role" : "dbabd", "db" : "admin" }, { "role" : "read", "db" : "admin" } ] }show users;
{
"_id" : "admin.dbabd_user",
"user" : "dbabd_user", //这是创建的普通的用户
"db" : "admin",
"customData" : {
"info" : "user for dbabd"
},
"roles" : [
{
"role" : "read", //角色为只读
"db" : "dbabd" //针对dbadb这个数据库
},
{
"role" : "dbabd", //这个角色是我们自己创建自定义的角色 dbabd
"db" : "admin"
},
{
"role" : "read",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
{
"_id" : "admin.user_admin", //管理普通用户的用户
"user" : "user_admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
自定义实验 ***** 很重要,看完 https://www.cnblogs.com/dbabd/p/10811523.html 给自己出的题目 很重要
题目为:
在mongodb中需要先创建一个 管理用户的用户 vargo 密码为 vargo123 分配给他的权限为root
在创建一个majihui的普通用户 密码为 majihui123 只对 dbabd这个库有只读的权限
为了保持实验的可靠性,请重新安装mongodb 完全干净的进行实验
接下来,我们创建一个用户叫
//在mongodb中需要先创建一个 管理用户的用户 vargo 密码为 vargo123 分配给他的权限为root
在创建一个majihui的普通用户 密码为 majihui123 只对 dbabd这个库有只读的权限
// 创建管理用户用户名为vargo,密码vargo123
use admin
db.createUser(
{
user: "vargo",
pwd: "vargo123",
roles: [{ role: "root", db: "admin" }]
}
)
实际操作为:
> use admin
switched to db admin
> db.createUser(
... {
... user: "vargo",
... pwd: "vargo123",
... roles: [{ role: "root", db: "admin" }]
... }
... )
Successfully added user: {
"user" : "vargo",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
接下来,我们关闭 mongodb 然后重启mongodb 之后,然后进行 用户管理用户验证 的开启mongodb方式
[root@prd3-mysql-0-36 ~]# mongod -f /ivargo/app/mongodb/conf/mongo.conf --auth
vargo就是最高权限了
//接下来创建一个majihui的普通用户 密码为 majihui123 只对 dbabd这个库有只读的权限
use admin
db.createUser(
{
user: "majihui",
pwd: "majihui123",
roles:[{role:"read",db:"dbabd"}],
customData: { info: "user for dbabd" }
}
)
实际操作
> use admin
switched to db admin
> db.createUser(
... {
... user: "majihui",
... pwd: "majihui123",
... roles:[{role:"read",db:"dbabd"}],
... customData: { info: "user for dbabd" }
... }
... )
Successfully added user: {
"user" : "majihui",
"roles" : [
{
"role" : "read",
"db" : "dbabd"
}
],
"customData" : {
"info" : "user for dbabd"
}
}
我们来验证一下
[root@prd3-mysql-0-36 ~]# mongo
MongoDB shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.2
use admin
switched to db admin
db.auWarning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
db.auth('majihui','majihui123')
1
show dbs;
dbabd 0.000GB
use dbabd;
switched to db dbabd
show collections;
city
user_operation
db.city.find();
{ "_id" : ObjectId("5ce27f0484dc5c8b35081590"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 NOSQL 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5ce27f1184dc5c8b35081591"), "title" : "redis 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5ce27f1784dc5c8b35081592"), "title" : "mysql 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
db.user_operation.count();
1
//我们接下来 去尝试的插入一个数据试一下
db.user_operation.insert({title: 'majihui 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 300
})
实际操作
db.user_operation.insert({title: 'majihui 教程',
... description: 'MongoDB 是一个 Nosql 数据库',
... by: '菜鸟教程',
... url: 'http://www.runoob.com',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 300
... })
WriteCommandError({
"ok" : 0,
"errmsg" : "not authorized on dbabd to execute command { insert: \"user_operation\", ordered: true, lsid: { id: UUID(\"441b14ee-ab6e-44c3-9b23-7640ceeb6b1f\") }, $db: \"dbabd\" }",
"code" : 13,
"codeName" : "Unauthorized"
})
出现报错,正确
//我们接下来尝试的去删除一个文档
db.user_operation.find();
{ "_id" : ObjectId("5ce27f4684dc5c8b35081593"), "title" : "mysql 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
db.user_operation.deleteMany( title : "mysql 教程");
2019-05-21T14:04:45.765+0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell):1:36
//报错,无法删除,对了
db.user_operation.find();
{ "_id" : ObjectId("5ce27f4684dc5c8b35081593"), "title" : "mysql 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }