目錄
- MongoDB 的安全配置
- 演示前準備:啟動 mongodb 服務器 和 客戶端 :
- 1、啟動單機模式的 mongodb 服務器
- 2、啟動 mongodb 的客戶端
- MongoDB 的安全配置
- 啟動演示用到的 mongodb 服務器 和 客戶端
- 啟動單機模式的 mongodb 服務器:
- 啟動 mongodb 的客戶端
- MongoDB 操作數據庫命令
- MongoDB 的幫助系統
- 在 客戶端 創建用戶:
- 1、切換到 admin 數據庫
- 2、創建管理員 admin
- 3、創建超級管理員 root
- 4、再創建兩個普通的用戶 LJHAAA 和 LJHBBB
- 5、刪除用戶演示
- MongoDB 所支持的權限
- 啟動 MongoDB 安全控制
- 1、修改 mongod.conf 配置文件
- 2、重啟 mongodb 客戶端
- 3、用戶登錄 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 的安全配置
在默認情況下,MongoDB 并不需要安全認證即可直接進入,就像前面配置副本集時,直接使用 mongo.exe(客戶端)即可連接 mongodb 服務器。
這樣明顯不安全,接下來給 mongodb 搞個安全配置–創建用戶及權限名、啟用Mongodb安全控制、mongodb 權限的設計
啟動演示用到的 mongodb 服務器 和 客戶端
接下來的演示:啟動單機模式的mongodb服務器和客戶端服務器就可以了
啟動單機模式的 mongodb 服務器:
mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"
啟動 mongodb 的客戶端
啟動 mongodb 的客戶端,指定要連接的 mongodb 服務器的端口號
mongo mongodb://192.168.0.107:27017
之所以只需要輸入 mongo 就能啟動 mongodb 的客戶端,是因為我之前把 mongodb 的 bin 目錄添加到 path 環境變量里面 。
MongoDB 操作數據庫命令
在介紹配置用戶之前,先介紹 MongoDB 操作數據庫的命令:
show databases:查看當前節點的所有數據庫(和MySQL相同)
show users: 查看當前數據庫中的用戶
db:查看當前連接的數據庫。
有可能當前所在的數據庫其實根本不存在。
use 數據庫名:切換 或 創建 數據庫(和MySQL相似)。
對 mongodb 來說,如果切換的數據庫不存在,該命令就會自動創建數據庫,這意味著你永遠不會切換失敗;
但是,只有當新數據庫中插入文檔之后才會真正創建該數據庫。
從此處可以看到,在MongoDB,你通常并不需要顯式創建數據庫。
db.dropDatabase():刪除數據庫。無需指定數據庫名,該命令總是刪除當前連接的數據庫。
db.dropUser(“用戶名”): 刪除指定用戶
上面的命令大概就是這個邏輯:
MongoDB 的幫助系統
什么是MongoDB的幫助系統?
除了show、use 等特殊命令之外,其他命令要么是 rs.* 開頭的,要么是 db.* 開頭的,
這是因為MongoDB命令系統采用了“面向對象”的設計方式,它認為:
1、所有與副本集有關的命令都相當于rs對象的方法,
2、所有與數據庫有關的命令都相當于db對象的方法。
這樣設計的好處就是可以非常方便使用這些命令的幫助系統。
比如想知道db對象包含哪些方法(命令),只要輸入db.help()。
如圖:這些 rs.help() 、 db.help() 這種命令, 可以在命令行窗口查看有哪些命令方法可用的【命令行幫助】,就是 mongodb 的幫助系統。
如圖:輸入 db.help() :查看當前連接的數據庫包含哪些方法(命令)
上面有關 db 開頭的命令,在如下圖片都可以找到。
輸入 rs.help() 查看副本集有哪些命令可用。
一些解釋:
rs 對象:代表副本集,
副本集是一種用于提供數據冗余和高可用性的數據庫部署方式。
副本集包含多個MongoDB實例(節點),其中一個是主節點(primary),其余的是從節點(secondary)。
副本集為應用程序提供了數據冗余和故障恢復能力,同時還允許讀操作(查詢)可以在多個節點上進行。
db 對象:代表當前所連接的數據庫
如之前測試過的這些命令:
這些命令是操作副本集的,所以是 rs 開頭的:
rs.initiate(rs_conf):在 mongodb 客戶端初始化副本集
rs.conf() :查看副本集的配置。
rs.status() :查看副本集的狀態,可看到副本集內誰是主節點,誰是副節點,誰是仲裁節點等詳細信息。
rs.slaveOk(boolean) :該命令設置副節點上是否可查看數據
這些命令是操作 db 對象的,所以是 db 開頭的:
db.isMaster() :查看當前連接是否為主節點。
在 客戶端 創建用戶:
現在要在 admin 數據庫里面添加兩個用戶:超級管理員 root 和 管理員 admin
賬號:root;密碼:123456
賬號:admin:密碼:123456
通過 MongoDB 客戶端執行如下命令:
1、切換到 admin 數據庫
這個命令,表示切換到 admin 這個數據庫,這樣的話,后面創建的用戶將會保存在 admin 數據庫中
use admin
2、創建管理員 admin
這條命令就是創建一個 admin 用戶,且該用戶保存 admin 數據庫中。基本上它是一個 管理員。
( 數據庫叫 admin ,我這里創建一個叫 admin 的用戶,并不會有任何沖突,創建的用戶名按個人喜好即可)
db.createUser({ user: "admin",pwd: "123456",roles: [{ role: "readWriteAnyDatabase", db: "admin" },{ role: "userAdminAnyDatabase", db: "admin" },{ role: "dbAdminAnyDatabase", db: "admin" }]});
上面命令的解釋:
roles 是個數組,里面的 role 就是具體的權限。
如 :role: readWriteAnyDatabase 表示有讀寫任意數據庫的權限,
db: “admin” 表示: 【role這個讀寫任意數據庫的權限】只對 【admin】 這個數據庫生效
admin 這個數據庫,是 mongodb 的一個管理級的一個特殊的數據庫,是有特殊意義的,所以【readWriteAnyDatabase 】 這個權限在名義上只對【admin】這個數據庫起作用,
但是實際上,【admin 】數據庫里面擁有【readWriteAnyDatabase 】這個權限的 【admin】 這個用戶,對任意數據庫都具有讀寫的功能,不會只局限在【admin】 這個數據里面。
注意點:也只有【admin】這個數據庫,才能有【readWriteAnyDatabase 】這個操作任意數據庫的權限,如果是我自己創建的一個數據庫,是無法為用戶設置【readWriteAnyDatabase 】這種類型的權限的,會報錯該數據庫沒有這個權限的用戶。
3、創建超級管理員 root
這條命令就是創建一個 root 用戶,且該用戶保存 admin 數據庫中。基本上它是一個 超級管理員。
(root 這個權限也只能放在 admin 這種特殊的數據庫里面才能生效)
(root 是最高權限,可以做任何事情)
db.createUser({ user: "root",pwd: "123456",roles: [{ role: "root", db: "admin" }]});
4、再創建兩個普通的用戶 LJHAAA 和 LJHBBB
賬號: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" }]});
賬號:LJHBBB
密碼:123456
db.createUser({ user: "LJHBBB",pwd: "123456",roles: [{ role: "readWriteAnyDatabase", db: "admin" },{ role: "userAdmin", db: "local" },{ role: "readWrite", db: "springboot" }]});
5、刪除用戶演示
再添加 LJHCCC 這個用戶,然后演示刪除。
db.createUser({ user: "LJHCCC",pwd: "123456",roles: [{ role: "readWriteAnyDatabase", db: "admin" },{ role: "userAdmin", db: "local" },{ role: "readWrite", db: "springboot" }]});
添加后可以輸入:show users 查看有哪些用戶
可以看到 LJHCCC 這個用戶已經創建成功
db.dropUser(“LJHCCC”): 刪除指定用戶
true 表示刪除 LJHCCC 這個用戶成功,再用 show users 命令查看已經沒有這個用戶存在了
MongoDB 所支持的權限
read:允許讀取指定數據庫中數據的權限。
readWrite:允許讀、寫指定數據庫中數據的權限。
dbAdmin:允許對指定數據庫中執行管理函數的權限,如索引創建、刪除,查看統計或訪問 system.profile。
userAdmin:允許對指定數據庫執行用戶管理的權限,比如創建、刪除和修改用戶。
clusterAdmin:只對admin數據庫可用,授予用戶所有分片和副本集相關函數的管理權限。表明分配該權限時,后面的db屬性值只能是admin。
readAnyDatabase:只對admin數據庫可用,授予用戶對所有數據庫的read權限。
readWriteAnyDatabase:只對admin數據庫可用,授予用戶對所有數據庫的readWrite權限。
userAdminAnyDatabase:只對admin數據庫可用,授予用戶對所有數據庫的userAdmin權限。
dbAdminAnyDatabase:只對admin數據庫可用,授予用戶對所有數據庫的dbAdmin權限。
root:只對admin數據庫可用。超級賬號,超級權限。
啟動 MongoDB 安全控制
1、修改 mongod.conf 配置文件
先停止 mongodb 的客戶端,然后修改 mongod.conf 文件,
在該文件后面增加如下配置:
# 啟用安全控制
security:authorization: enabled
再次啟動 mongodb 的客戶端,這樣 MongoDB 的 用戶和安全控制 都配置完成了。
2、重啟 mongodb 客戶端
啟動 mongodb 的客戶端,指定要連接的 mongodb 服務器的端口號:
mongo mongodb://192.168.0.107:27017
簡而言之:就是先修改配置文件:增加 security 的設置;然后重啟客戶端即可。
3、用戶登錄 mongodb 演示
【切記】: 當你登錄 MongoDB 時,你必須要先進入保存了登錄用戶的數據庫。
(就是我們上面創建的用戶都是保存在 admin 這個數據庫里面的,所以需要先進去到 admin 這個數據庫,然后再進行用戶登錄驗證)
如圖:剛登錄 mongodb 時,連接的數據庫是test,需要切換到 admin 數據庫,才能登錄成功,因為創建的用戶都是保存在 admin 數據庫的。
好奇為什么這個 mongodb 服務器不用重啟,而只是 客戶端 需要重啟。