目錄
- MongoDB 權限的設計
- 演示前準備:啟動 mongodb 服務器 和 客戶端 :
- 1、啟動單機模式的 mongodb 服務器
- 2、啟動 mongodb 的客戶端
- MongoDB 權限的設計
- 1、MongoDB 的每個數據庫都可以保存用戶,不止admin數據庫可以保存用戶。
- 2、保存用戶的數據庫和該用戶有權限操作的數據庫完全可以是不同的。
- 3、當用戶登錄時,必須在保存該用戶的數據庫中才能登錄。
- 4、該用戶登錄之后,能否操作哪個數據庫,才能看出來該用戶對哪些數據庫有操作權限。
- 5、在MongoDB中創建一個數據庫之后,應該在該數據庫中創建自己存儲的用戶,否則就無法在初始連接時僅通過該數據庫建立連接
MongoDB 權限的設計
演示前準備:啟動 mongodb 服務器 和 客戶端 :
本次演示,只需要啟動一個 單機模式的 mongodb 服務器 和 一個 mongodb 的客戶端,
1、啟動單機模式的 mongodb 服務器
打開命令行窗口,執行如下命令即可啟動 MongoDB 服務器了
mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"
就是只啟動一個 mongodb 的服務器
2、啟動 mongodb 的客戶端
啟動 mongodb 的客戶端,指定要連接的 mongodb 服務器的端口號:
mongo mongodb://192.168.0.107:27017
即可啟動 mongodb 的客戶端
啟動成功,如圖:
之所以只需要輸入 mongo 就能啟動 mongodb 的客戶端,是因為我之前把 mongodb 的 bin 目錄添加到 path 環境變量里面 。
MongoDB 權限的設計
1、MongoDB 的每個數據庫都可以保存用戶,不止admin數據庫可以保存用戶。
這一點和傳統數據庫只能使用系統數據庫來保存用戶是截然不同的。
2、保存用戶的數據庫和該用戶有權限操作的數據庫完全可以是不同的。
比如 ljh 這個用戶保存在 【admin】這個數據庫里面,但是創建 ljh 這個用戶的時候,只給這個用戶操作【springboot】這個數據庫的權限。
所以雖然 ljh 這個用戶是在【admin】 這個數據庫創建的,當時確沒有操作【admin】數據庫的權限。
3、當用戶登錄時,必須在保存該用戶的數據庫中才能登錄。
比如我登錄到 admin 這個數據庫
mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456
然后創建一個數據【hahaha】
在【hahaha】數據庫添加一個用戶叫 AAA,然后這個用戶對這個數據庫有讀寫的權限
userAdmin:允許對指定數據庫執行用戶管理的權限,比如創建、刪除和修改用戶
db.createUser({ user: "AAA",pwd: "123456",roles: [{ role: "readWrite", db: "hahaha" },{ role: "userAdmin", db: "hahaha" }]});
重點來了:這個用戶是創建在【hahaha】這個數據庫里面的。
演示用戶登錄時,先演示登錄到保存該用戶的數據中
mongo mongodb://192.168.0.107:27017/hahaha -u AAA -p 123456
如圖,登錄成功,還能執行查看用戶的操作,說明登錄成功沒問題。
因為 【AAA】這個用戶是保存在【hahaha】這個數據庫中的,說明當用戶登錄時,必須在保存該用戶的數據庫中才能登錄。
AAA 用戶是保存在【hahaha】數據庫的,現在看能不能登錄到 admin 數據庫
mongo mongodb://192.168.0.107:27017/admin -u AAA -p 123456
如圖:登錄失敗,這就說明了當用戶登錄時,必須在保存該用戶的數據庫中才能登錄。
【注意】此時的【hahaha】數據庫只是添加了 【AAA】這個用戶,還不算是真正創建出這個數據庫來,
所以給這個數據庫添加一條數據,【hahaha】數據庫才算是真正創建出來。
4、該用戶登錄之后,能否操作哪個數據庫,才能看出來該用戶對哪些數據庫有操作權限。
【切記:】 用戶保存在哪個數據庫中,用戶初始登錄時就必須連接該數據庫——只有連接該數據庫才能驗證用戶。
這個在第3點也說了,就是 【AAA】這個用戶,是保存在【hahaha】這個數據庫里面的,所以在初始登錄的時候,【AAA】這個用戶只有指定是登錄【hahaha】這個數據庫,才能登錄成功,授權成功。
這里再演示一遍:
登錄mongodb時,【admin -u admin -p 123456】這個指定【登錄的數據庫、賬號和密碼】,就是初始登錄時連接的數據
mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456
1、登錄的是admin用戶,登錄的數據庫是保存admin用戶的【admin】數據庫,所以admin這個用戶可以正常使用命令查看數據庫
2、登錄的是 AAA 用戶,AAA用戶是保存在【hahaha】數據庫里面的,但是此時的初始登錄,連接的是admin 數據庫
mongo mongodb://192.168.0.107:27017/admin -u AAA -p 123456
如圖:AAA用戶在初始登錄時,驗證授權沒通過,因為用戶保存在哪個數據庫中,用戶初始登錄時就必須連接該數據庫——只有連接該數據庫才能驗證用戶
3、登錄的是 AAA 用戶,AAA用戶是保存在【hahaha】數據庫里面的,此時的初始登錄,連接的就是【hahaha】數據庫
mongo mongodb://192.168.0.107:27017/hahaha -u AAA -p 123456
如圖:AAA用戶登錄之后,能操作到【hahaha】數據庫這個數據庫,報名這個用戶有操作這個數據庫的權限。
但是如圖,它只能查看到 【hahaha】這個數據庫,也表明它只對這個數據庫有操作權限。
注意:因為 AAA 用戶只有操作 【hahaha】 數據庫的權限,所以查看命令也只能查看到自己有權限操作的數據庫。
admin 之所以能查看所有數據庫,是因為在之前設置時,把它設置成管理員。
5、在MongoDB中創建一個數據庫之后,應該在該數據庫中創建自己存儲的用戶,否則就無法在初始連接時僅通過該數據庫建立連接
如圖:根據3、4點的解釋,來說明:登錄的是 AAA 用戶,AAA用戶是保存在【hahaha】數據庫里面的,但是此時的初始登錄,連接的是admin 數據庫,所以就無法在初始連接時與該數據庫建立連接。
演示:
說明:如果你希望程序可以一開始就能連接你所創建的數據庫,
-
你應該在該數據庫中創建自己的用戶。
-
且要讓該用戶有操作本數據庫的權限——否則你只能登錄,登錄之后根本就無法訪問該數據庫。
【通常:】 通常保存用戶的數據庫,跟用戶有權限操作的數據庫還是應該相同,這樣才更符合邏輯。
1、創建一個springboot的數據庫
2、在springboot中創建一個用戶,且要讓該用戶有操作本數據庫的權限
(這個用戶只有讀寫的權限)
賬號:LJHCCC
密碼:123456
db.createUser({ user: "LJHCCC",pwd: "123456",roles: [{ role: "readWrite", db: "springboot" },{ role: "userAdmin", db: "springboot" }]});
在啟動一個命令行窗口,登錄這個數據庫
mongo mongodb://192.168.0.107:27017/springboot -u LJHCCC -p 123456
如圖:在MongoDB中創建一個數據庫(springboot)之后,在該數據庫中創建自己存儲的用戶(LJHCCC),就可以在初始連接時通過該數據庫建立連接
因為 LJHCCC 這個用戶只能操作 springboot 這個數據庫,
所以查看有哪些數據庫時,也只能查到有他操作權限的那個數據庫
演示創建一個數據庫,然后添加一個用戶,這個數據庫還是沒有被真正創建出來,只有往該數據庫插入數據,才能算是正在創建出該數據庫。
賬號:LJHAAA
密碼:123456
db.createUser({ user: "LJHAAA",pwd: "123456",roles: [{ role: "readWrite", db: "local" },{ role: "userAdmin", db: "local" },{ role: "readWrite", db: "springboot" },{ role: "userAdmin", db: "springboot" }]});
添加一條數據的命令:db.test.insert({“aaa”:1})