理解admin資料庫 安裝MongoDB時,會自動創建admin資料庫,這是一個特殊的庫。有些用戶賬戶角色賦予用戶操作多個資料庫的許可權,而這些用戶只能在admin資料庫中創建。要創建有權操作所有資料庫的超級用戶,必須將該用戶加入到admin資料庫中。檢查憑證時,MongoDB將在指定資料庫和admi ...
理解admin資料庫
安裝MongoDB時,會自動創建admin資料庫,這是一個特殊的庫。有些用戶賬戶角色賦予用戶操作多個資料庫的許可權,而這些用戶只能在admin資料庫中創建。要創建有權操作所有資料庫的超級用戶,必須將該用戶加入到admin資料庫中。檢查憑證時,MongoDB將在指定資料庫和admin資料庫中檢查用戶賬戶。
管理用戶賬戶
在MongoDB shell中,可添加、刪除和配置用戶。
創建用戶賬戶
資料庫管理的一個重要部分是創建能夠管理用戶和資料庫以及讀寫資料庫的用戶賬戶。
創建一個資料庫新用戶用db.createUser()方法,如果用戶存在則返回一個用戶重覆錯誤。
db.createUser(user, writeConcern)
user: 這個文檔創建關於用戶的身份認證和訪問信息。
writeConcern: 這個文檔描述保證MongoDB提供寫操作的成功報告。
user文檔,定義了用戶的以下形式
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
user文檔欄位介紹
user |
獨一無二的用戶名 |
pwd | 用戶的密碼 |
cusomData | 為任意內容,例如可以為用戶全名介紹 |
roles | 指定用戶的角色,可以用一個空數組給用戶設定空角色 |
在roles欄位,可以指定內置角色和用戶定義的角色。
內置角色(Built-In Roles)
內置角色是MongoDB預定義的角色,操作的資源是在DB級別上。MongoDB擁有一個SuperUser的角色:root,擁有最大許可權,能夠執行任意操作。
資料庫用戶角色(Database User Roles):
- read:授予User用戶只讀許可權
- readWriter:授予User用戶讀寫許可權
資料庫管理角色(Database Administration Riles):
- dbAdmin:在當前DB中執行管理操作
- adOwner:在當前DB中執行任意操作
- userAdmin:在當前DB中管理用戶
集群管理角色(Cluster Administration Roles):
- clusterAdmin:授予管理集群的最高許可權
- clusterManager:授予管理和監控集群的許可權
- clusterMonitor:授予監控集群的許可權,對監控工具具有readonly的許可權
- hostManager:管理Server
備份恢復角色(Backup and Restoration Roles):
- backup
- restore
所有資料庫角色(All-Database Roles):
- readAnyDatabase:授予在所有資料庫上讀取數據的許可權
- readWriterAnyDatabase:授予在所有資料庫上讀取數據的許可權
- userAdminAnyDatabase:授予在所有資料庫上管理用戶的許可權
- dbAdminAnyDatabase:授予管理所有資料庫的許可權
writeConcern文檔
- w選項:允許的值分別是 1、0、大於1的值、"majority"、<tag set>;
- j選項:確保mongod實例寫數據到磁碟上的journal(日誌),這可以確保mongd以外關閉不會丟失數據。設置true啟用。
- wtimeout:指定一個時間限制,以毫秒為單位。wtimeout只適用於w值大於1。
實例
在admin資料庫中創建一個管理員用戶。
use admin db.createUser( { user: "testadmin", pwd: "123456", roles:[ "dbAdmin" ] } );
如圖表示添加成功。
列出用戶
在每個資料庫中,用戶賬戶都存儲在集合db.system.users中。要獲取用戶列表,可以使用兩種不同的方法。
方法一:
切換到要列出其用戶賬戶的資料庫,再執行命令show users。
1 use admin 2 show users
方法二:
切換到要列出其用戶賬戶的資料庫,對集合db.system.users執行find等查詢。db.system.users.find()返回一個游標對象,可以用它來訪問User文檔。
1 var cur = db.system.users.find() 2 cur.count() 3 cur.toArray()
如圖不光可列出用戶,還可調用 count() 方法顯示出有幾個用戶。
刪除用戶
要將用戶從MongoDB資料庫中刪除,可使用方法 dropUser(<username>)。
實例
刪除之前演示中在 admin 資料庫中創建的 testadmin。
1 use admin 2 db.dropUser("testAdmin")
配置訪問控制
MongoDB提供了資料庫級身份驗證和授權,這意味著用戶賬戶存在與單個資料庫中。為支持基本的身份驗證,MongoDB在每個資料庫中都將用戶憑證存儲在集合system.users中。
MongoDB安裝後,資料庫admin中沒有任何用戶賬戶,此時MongoDB向從本地主機發起的連接提供全面的資料庫管理許可權。配置MongoDB時,首先需要創建用戶管理員賬戶和資料庫管理員賬戶。用戶管理員賬戶可在admin和其他資料庫中創建用戶賬戶。資料庫管理員賬戶可作為管理資料庫、集群、複製和MongoDB其他方面的超級用戶。
註意:
用戶管理員賬戶和資料庫管理員賬戶都是在admin資料庫中創建的。
創建用戶管理員賬戶
用戶管理員應只有創建用戶賬戶的許可權,而不能管理資料庫或執行其他管理任務。
用戶管理員的角色應為 userAdminAnyDatabase,這可以讓用戶管理員能夠新建用戶賬戶,但不能對資料庫執行其他操作。
1 use admin 2 db.createUser( { user: "userAdmin", pwd:"123456", roles: [ "userAdminAnyDatabase" ] } )
啟用身份驗證
創建用戶管理員賬戶後,使用參數--auth重啟MongoDB伺服器,也可在配置文件中指定auth設置。
mongod -dbpath <mongo_data_location>/data/db -auth
或配置文件
配置完成後,再想從MongoDB shell訪問MongoDB伺服器管理用戶時,必須向資料庫驗證身份,不然沒有許可權管理用戶。
可以執行下麵的命令向admin資料庫驗證身份。
use admin
db.auth("userAdmin","123456")
或在啟動MongoDB shell 時使用選項 --username和--password 向資料庫admin驗證身份。
mongo --username "userAdmin" --password "123456"
創建資料庫管理員賬戶
資料庫管理員的角色應為 readWriteAnyDatabase、dbAdminAnyDatabase 和 clusterAdmin 。這讓這名用戶能夠訪問系統中所有資料庫、創建新的資料庫以及管理MongoDB集群和副本集。
use admin db.createUser( { user: "dbadmin", pwd:"123456", roles: [ "readWriteAnyDatabase","dbAdminAnyDatabase","clusterAdmin" ] } )
註意:用戶管理員沒有許可權通過MongoDB shell關閉mongod伺服器,必須切換到資料庫管理員賬戶才可關閉mongod伺服器。