MongoDB權(quán)限管理基礎(chǔ)概念
概念解釋
1.數(shù)據(jù)庫(kù)用戶角色
read:該角色擁有數(shù)據(jù)的只讀權(quán)限,系統(tǒng)集合以及system.indexes,system.js,system.namespaces集合除外。
readWrite:該角色擁有對(duì)應(yīng)數(shù)據(jù)庫(kù)的讀寫(xiě)權(quán)限,系統(tǒng)集合和system.js集合除外。
2.數(shù)據(jù)庫(kù)管理角色
dbAdmin:該角色擁有指定數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)管理權(quán)限,包括 system.indexes, system.namespaces, system.profile集合的操作權(quán)限。該角色不擁有所有非系統(tǒng)集合的讀權(quán)限。
dbOwner:該角色擁有指定數(shù)據(jù)庫(kù)的所有權(quán)限,該角色包括:readWrite、dbAdmin、userAdmin。
userAdmin:該角色擁有指定數(shù)據(jù)庫(kù)用戶和角色的管理權(quán)限。包括創(chuàng)建用戶等。
3.群集管理角色
clusterAdmin:該角色擁有群集的所有權(quán)限。該角色包含clusterManager,clusterMonitor,hostManager 角色權(quán)限。同時(shí)還要?jiǎng)h除數(shù)據(jù)庫(kù)的權(quán)限。
clusterManager:該角色擁有群集的管理和監(jiān)控權(quán)限,包括對(duì)local、config數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限。同時(shí)該角色擁有分片和復(fù)制集的管理權(quán)限。
clusterMonitor:該角色擁有群集的監(jiān)控權(quán)限。
hostManager:該角色擁有群集的監(jiān)控和服務(wù)管理權(quán)限。
//注意:這些角色只能在Admin數(shù)據(jù)庫(kù)下創(chuàng)建
4.備份還原角色
backup:該角色擁有備份數(shù)據(jù)的權(quán)限。
restore:該角色擁有還原備份數(shù)據(jù)的權(quán)限。
//注意:這些角色只能在Admin數(shù)據(jù)庫(kù)下創(chuàng)建
5.所有數(shù)據(jù)庫(kù)角色
該分類(lèi)下面的角色權(quán)限和數(shù)據(jù)庫(kù)角色權(quán)限一樣,區(qū)別在于它擁有的是所有數(shù)據(jù)庫(kù)的權(quán)限而不是指定數(shù)據(jù)庫(kù)下的權(quán)限。但是不擁有system.*相關(guān)集合、local、config數(shù)據(jù)庫(kù)的權(quán)限。
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase
//注意:這些角色只能在Admin數(shù)據(jù)庫(kù)下創(chuàng)建
6.超級(jí)權(quán)限角色
root:該角色擁有所有權(quán)限,該角色包含readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin roles, restore, and backup角色。
注意:該角色只能在創(chuàng)建在Admin庫(kù)中
7.內(nèi)部角色
__system:該角色為系統(tǒng)內(nèi)部角色,比如復(fù)制集成員、mongos使用。
作為一家“創(chuàng)意+整合+營(yíng)銷(xiāo)”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)公司提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開(kāi)發(fā)以及后續(xù)網(wǎng)站營(yíng)銷(xiāo)運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷(xiāo)方法,創(chuàng)造更大的價(jià)值。
參考鏈接:我們需要整理小結(jié)一下,整個(gè)流程
MongoDB 4.X 用戶和角色權(quán)限管理總結(jié)
https://www.cnblogs.com/dbabd/p/10811523.html
//完全參照此鏈接 可行
小結(jié)如下:
1、謹(jǐn)記:先在不開(kāi)啟認(rèn)證的情況下,創(chuàng)建用戶,之后關(guān)閉服務(wù),然后再開(kāi)啟認(rèn)證,才生效。
2、我們正常的搭建mongodb,然后在創(chuàng)建自定義角色
(在admin數(shù)據(jù)庫(kù)中創(chuàng)建自定義用戶dbabd,對(duì)集合city有find,update權(quán)限,對(duì)集合user_operation只有find權(quán)限。)
//我的猜想,我們可以不創(chuàng)建這個(gè) 后面進(jìn)行驗(yàn)證
3、用戶,必須先創(chuàng)建“創(chuàng)建用戶管理的用戶”
//啟用訪問(wèn)控制登錄之前,首先需要在admin數(shù)據(jù)庫(kù)中創(chuàng)建角色為userAdmin或userAdminAnyDatabase作為用戶管理的用戶,之后才能通過(guò)這個(gè)用戶創(chuàng)建其它角色的用戶,這個(gè)用戶作為其它所有用戶的管理者。
4、開(kāi)啟訪問(wèn)控制,在這里我們?cè)趩?dòng) mongodb的時(shí)候加上--auth (注意,我們?cè)谂渲梦募屑觓uth=true的時(shí)候沒(méi)有成功)
//[root@prd3-MySQL-0-36 ~]# mongod -f /ivargo/app/mongodb/conf/mongo.conf --auth
5、用戶管理用戶驗(yàn)證 可以使用我們創(chuàng)建的管理用戶的用戶去登錄 ,在這里就是user_admin 這個(gè)用戶去登錄
//可以理解為 是目前mongodb的最高權(quán)限者
6、接下來(lái),才是創(chuàng)建一個(gè)普通用戶,給他某個(gè)庫(kù)的可讀,可寫(xiě)的權(quán)限
//也就是說(shuō),必須要自己先創(chuàng)建一個(gè)管理普通用戶的用戶,然后在登錄到這個(gè)管理用戶的用戶下 去創(chuàng)建文明想要?jiǎng)?chuàng)建的用戶。
7、創(chuàng)建好了普通用戶,之后,就是為用戶添加角色(我的理解,角色就是權(quán)限的意思)
比如 為用戶dbabd_user添加dbabd數(shù)據(jù)庫(kù)的read角色(權(quán)限)。
接下來(lái),我們可以根據(jù)我寫(xiě)的小結(jié),再次的實(shí)驗(yàn)一次
上面的測(cè)試中創(chuàng)建管理用戶用戶名 的角色為 userAdminAnyDatabase 他的權(quán)限分配為:可以在指定數(shù)據(jù)庫(kù)創(chuàng)建和修改用戶(除了數(shù)據(jù)庫(kù)config和local之外)。
如果是root的角色的話,那么就是超級(jí)最大的權(quán)限 ,我們下面試一下,最高的root權(quán)限
// 創(chuàng)建管理用戶用戶名為user_admin,密碼admin
db.createUser(
{
user: "user_admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
//總結(jié)
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", //這是創(chuàng)建的普通的用戶
"db" : "admin",
"customData" : {
"info" : "user for dbabd"
},
"roles" : [
{
"role" : "read", //角色為只讀
"db" : "dbabd" //針對(duì)dbadb這個(gè)數(shù)據(jù)庫(kù)
},
{
"role" : "dbabd", //這個(gè)角色是我們自己創(chuàng)建自定義的角色 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"
]
}
自定義實(shí)驗(yàn) ***** 很重要,看完 https://www.cnblogs.com/dbabd/p/10811523.html 給自己出的題目 很重要
題目為:
在mongodb中需要先創(chuàng)建一個(gè) 管理用戶的用戶 vargo 密碼為 vargo123 分配給他的權(quán)限為root
在創(chuàng)建一個(gè)majihui的普通用戶 密碼為 majihui123 只對(duì) dbabd這個(gè)庫(kù)有只讀的權(quán)限
為了保持實(shí)驗(yàn)的可靠性,請(qǐng)重新安裝mongodb 完全干凈的進(jìn)行實(shí)驗(yàn)
接下來(lái),我們創(chuàng)建一個(gè)用戶叫
//在mongodb中需要先創(chuàng)建一個(gè) 管理用戶的用戶 vargo 密碼為 vargo123 分配給他的權(quán)限為root
在創(chuàng)建一個(gè)majihui的普通用戶 密碼為 majihui123 只對(duì) dbabd這個(gè)庫(kù)有只讀的權(quán)限
// 創(chuàng)建管理用戶用戶名為vargo,密碼vargo123
use admin
db.createUser(
{
user: "vargo",
pwd: "vargo123",
roles: [{ role: "root", db: "admin" }]
}
)
實(shí)際操作為:
> 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"
}
]
}
接下來(lái),我們關(guān)閉 mongodb 然后重啟mongodb 之后,然后進(jìn)行 用戶管理用戶驗(yàn)證 的開(kāi)啟mongodb方式
[root@prd3-mysql-0-36 ~]# mongod -f /ivargo/app/mongodb/conf/mongo.conf --auth
vargo就是最高權(quán)限了
//接下來(lái)創(chuàng)建一個(gè)majihui的普通用戶 密碼為 majihui123 只對(duì) dbabd這個(gè)庫(kù)有只讀的權(quán)限
use admin
db.createUser(
{
user: "majihui",
pwd: "majihui123",
roles:[{role:"read",db:"dbabd"}],
customData: { info: "user for dbabd" }
}
)
實(shí)際操作
> 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"
}
}
我們來(lái)驗(yàn)證一下
[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 是一個(gè) NOSQL 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5ce27f1184dc5c8b35081591"), "title" : "redis 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5ce27f1784dc5c8b35081592"), "title" : "mysql 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
db.user_operation.count();
1
//我們接下來(lái) 去嘗試的插入一個(gè)數(shù)據(jù)試一下
db.user_operation.insert({title: 'majihui 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 300
})
實(shí)際操作
db.user_operation.insert({title: 'majihui 教程',
... description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
... by: '菜鳥(niǎo)教程',
... 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"
})
出現(xiàn)報(bào)錯(cuò),正確
//我們接下來(lái)嘗試的去刪除一個(gè)文檔
db.user_operation.find();
{ "_id" : ObjectId("5ce27f4684dc5c8b35081593"), "title" : "mysql 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "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
//報(bào)錯(cuò),無(wú)法刪除,對(duì)了
db.user_operation.find();
{ "_id" : ObjectId("5ce27f4684dc5c8b35081593"), "title" : "mysql 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)", "by" : "菜鳥(niǎo)教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }