溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mongodb關(guān)于用戶權(quán)限的總結(jié)

發(fā)布時(shí)間:2020-08-18 21:59:52 來(lái)源:ITPUB博客 閱讀:170 作者:lusklusklusk 欄目:關(guān)系型數(shù)據(jù)庫(kù)

官方文檔

https://docs.mongodb.com/v3.6/reference/built-in-roles/

https://docs.mongodb.com/v3.6/reference/method/db.auth/


總結(jié)

1、mongodb啟動(dòng)的時(shí)候加了--auth參數(shù),則mongo命令連接到mongodb數(shù)據(jù)庫(kù)后,執(zhí)行show dbs這樣的操作都會(huì)報(bào)錯(cuò),需要執(zhí)行db.auth("user","PWD")驗(yàn)證用戶密碼正確后,才能執(zhí)行操作,且該user有什么權(quán)限就只能執(zhí)行什么操作

2、授權(quán)操作可以在創(chuàng)建用戶db.createUser的時(shí)候授權(quán),也可以使用db.grantRolesToUser對(duì)已存在用戶授權(quán)

3、mongodb的用戶是放在一個(gè)個(gè)的數(shù)據(jù)庫(kù)里面,比如db.system.users.find()顯示_id為db1.user1表示在db1庫(kù)中創(chuàng)建了一個(gè)用戶user1,_id為db2.user1表示在db2庫(kù)中創(chuàng)建了一個(gè)用戶user1,和mysql用戶模式user@host有點(diǎn)類似

4、root、readWriteAnyDatabase等角色的用戶必須綁定admin庫(kù),不是說(shuō)root角色的用戶只能在admin庫(kù)中創(chuàng)建,如下在test1庫(kù)中建立用戶名為root的用戶,擁有root角色綁定了admin庫(kù),以后在test1庫(kù)中執(zhí)行auth正常后,可以執(zhí)行任何操作。當(dāng)然這個(gè)test1庫(kù)中建立的root用戶在admin庫(kù)中執(zhí)行auth會(huì)報(bào)錯(cuò)Error: Authentication failed,因?yàn)檫@個(gè)用戶并不是admin庫(kù)中的用戶

>use test1
>db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin" }]})

5、mongodb中admin數(shù)據(jù)庫(kù)是一個(gè)特別的數(shù)據(jù)庫(kù),一些角色只能在admin庫(kù)中用,但是不代表admin庫(kù)中的用戶就擁有所有權(quán)限,如下在admin庫(kù)中建立一個(gè)用戶admin_user,這個(gè)用戶只在admin庫(kù)中有讀權(quán)限,無(wú)法讀其他數(shù)據(jù)庫(kù)。

>use admin
>db.createUser({user:"admin_user",pwd:"123456",roles:["read"]})

6、db.auth("user","PWD")驗(yàn)證時(shí),這個(gè)用戶user必須存在當(dāng)前數(shù)據(jù)庫(kù)下,如果當(dāng)前數(shù)據(jù)庫(kù)下不存在這樣用戶則會(huì)報(bào)錯(cuò)。不能說(shuō)具有root角色的用戶可以在任何數(shù)據(jù)庫(kù)中執(zhí)行db.auth驗(yàn)證,只能說(shuō)具有root角色的用戶1在這個(gè)用戶1指定的數(shù)據(jù)庫(kù)中執(zhí)行db.auth驗(yàn)證后,可以訪問(wèn)其他所有數(shù)據(jù)庫(kù)

7、異機(jī)使用mongo命令連接mongodb數(shù)據(jù)庫(kù)服務(wù)器的數(shù)據(jù)庫(kù)時(shí),必須指定該數(shù)據(jù)庫(kù)存在的用戶名和密碼。如下192.168.0.10/test1庫(kù)存在一個(gè)root超級(jí)管理員角色的用戶root密碼是123456,在test1庫(kù)中執(zhí)行db.auth("root","123456")后是可以訪問(wèn)所有數(shù)據(jù)庫(kù)的,但是192.168.0.10/test123庫(kù)不存在這樣的用戶。則前一條語(yǔ)句可以正常連接,后一條語(yǔ)句報(bào)錯(cuò)Error: Authentication failed無(wú)法連接。

mongo 192.168.0.10/test1 -u root -p "123456"   --正常,可以連接
mongo 192.168.0.10/test123 -u root -p "123456"  --報(bào)錯(cuò),認(rèn)證失敗,無(wú)法連接

8、mongodb查看當(dāng)前用戶使用命令db.runCommand({connectionStatus:1}),就像oracle執(zhí)行show users可以顯示當(dāng)前會(huì)話的用戶




創(chuàng)建用戶的時(shí)候授權(quán)db.createUser

>use test1
>db.createUser({user:"a1",pwd:"123456",roles:[{role:"clusterAdmin",db:"admin" },{role:"readAnyDatabase",db:"admin" },{role:"readWrite",db:"test"},"readWrite"]})

在test1這個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)用戶a1,這個(gè)用戶擁有集群管理權(quán)限、查詢?nèi)魏螖?shù)據(jù)庫(kù)的權(quán)限、讀寫test數(shù)據(jù)庫(kù)權(quán)限、讀寫test1數(shù)據(jù)庫(kù)的權(quán)限,最后一個(gè)readwrite沒(méi)有標(biāo)明數(shù)據(jù)庫(kù)表示在本地?cái)?shù)據(jù)庫(kù)的權(quán)限即在test1這個(gè)數(shù)據(jù)庫(kù)的權(quán)限

這個(gè)用戶a1,show users時(shí)只能在test1這個(gè)數(shù)據(jù)庫(kù)看到,在admin這個(gè)數(shù)據(jù)庫(kù)執(zhí)行show users看不這個(gè)用戶a1,因?yàn)檫@個(gè)用戶不是admin下面的用戶


readAnyDatabase角色必須綁定admin庫(kù),否則報(bào)錯(cuò)

>db.createUser({user:"a2",pwd:"123456",roles:[{role:"readAnyDatabase",db:"test" }]})

報(bào)錯(cuò)[thread1] Error: couldn't add user: No role named readAnyDatabase@test

readAnyDatabase只在admin中可用,把db:"test"改成db:"admin"即可


授予權(quán)限db.grantRolesToUser

>use test1
>db.grantRolesToUser("a1",[{role:"readWrite",db:"test2"}])

對(duì)數(shù)據(jù)庫(kù)test1中的a1用戶授予test2數(shù)據(jù)庫(kù)的讀寫權(quán)限


取消權(quán)限db.revokeRolesFromUser

>use test1
>db.revokeRolesFromUser("a1",[{role:"readWrite",db:"test2"}])

對(duì)數(shù)據(jù)庫(kù)test1中的a1用戶取消test2數(shù)據(jù)庫(kù)的讀寫權(quán)限


查詢用戶的三種方法

>show users --只能查看當(dāng)前數(shù)據(jù)庫(kù)下的用戶
>use admin
>db.system.users.find() --必須進(jìn)入admin數(shù)據(jù)庫(kù)執(zhí)行,能查詢所有數(shù)據(jù)庫(kù)下的所有用戶
>db.system.users.find().pretty() --必須進(jìn)入admin數(shù)據(jù)庫(kù)執(zhí)行,能查詢所有數(shù)據(jù)庫(kù)下的所有用戶,結(jié)果顯示界面比db.system.users.find()友好

如果不是進(jìn)入admin數(shù)據(jù)庫(kù)而是進(jìn)入其他數(shù)據(jù)庫(kù)比如A執(zhí)行上面兩個(gè),沒(méi)有返回結(jié)果,就算這個(gè)數(shù)據(jù)庫(kù)A下有用戶。


刪除用戶

>db.dropAllUsers();--刪除當(dāng)前庫(kù)下面的所有用戶,其他庫(kù)的用戶不受影響
>db.dropUser('a3');--刪除當(dāng)前庫(kù)下面的a3用戶


驗(yàn)證用戶

>use test1
>db.auth("a1","123456")

對(duì)數(shù)據(jù)庫(kù)test1中的a1用戶進(jìn)行驗(yàn)證,首先在test1庫(kù)中,a1用戶必須存在,其次a1用戶的密碼必須是123456,才能驗(yàn)證成功

結(jié)果返回1表示成功


mongodb啟動(dòng)時(shí)沒(méi)有用--auth參數(shù),mongo命令連接后也可以執(zhí)行db.auth

use db
db.createUser({user:"admin2",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
db.auth("admin2","admin2")--報(bào)錯(cuò)Error: Authentication failed
db.auth("admin2","123456")


角色列表

Read:允許用戶讀取指定數(shù)據(jù)庫(kù)

readWrite:允許用戶讀寫指定數(shù)據(jù)庫(kù)

dbAdmin:允許用戶擁有指定數(shù)據(jù)庫(kù)的的所有權(quán)限,如數(shù)據(jù)庫(kù)或集合或索引的創(chuàng)建、刪除,查看

userAdmin:允許用戶向system.users集合寫入,可以找指定數(shù)據(jù)庫(kù)里創(chuàng)建、刪除和管理用戶及角色

clusterAdmin:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限。

readAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶所有數(shù)據(jù)庫(kù)的讀權(quán)限

readWriteAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶所有數(shù)據(jù)庫(kù)的讀寫權(quán)限

userAdminAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶所有數(shù)據(jù)庫(kù)的userAdmin權(quán)限

dbAdminAnyDatabase:只在admin數(shù)據(jù)庫(kù)中可用,賦予用戶所有數(shù)據(jù)庫(kù)的dbAdmin權(quán)限。

root:只在admin數(shù)據(jù)庫(kù)中可用。超級(jí)賬號(hào),超級(jí)權(quán)限

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI