簡介
管理使用者和身份驗證是管理 MongoDB 伺服器最重要的管理任務之一。您必須確保伺服器已配置,能夠正確識別您的使用者和應用程式,並拒絕無法正確進行身份驗證的連線或操作。
為了管理這些要求,您必須能夠確定伺服器所需的使用者並建立這些賬戶。在此過程中,您可以設定身份驗證詳細資訊,以允許使用新身份進行外部訪問。
在本指南中,我們將逐步介紹如何建立、檢視和刪除使用者賬戶。我們將詳細說明如何為您的賬戶設定身份驗證以及在需要更改使用者密碼時如何更新憑據。
如果您正在使用 MongoDB,請檢視 Prisma 的MongoDB 聯結器!您可以使用Prisma Client自信地管理生產環境中的 MongoDB 資料庫。
要開始使用 MongoDB 和 Prisma,請檢視我們的從零開始指南或如何新增到現有專案。
先決條件
要跟隨本指南操作,您需要在具有適當許可權的MongoDB 伺服器上擁有一個賬戶。
我們將使用的命令和方法
要在 MongoDB 中建立、修改和刪除使用者以及配置身份驗證,您需要以下核心方法:
db.createUser:建立一個新的 MongoDB 使用者賬戶db.updateUser:更新使用者賬戶詳情db.changeUserPassword:更改使用者賬戶使用的密碼db.dropUser:刪除一個 MongoDB 使用者賬戶
此外,以下資料庫命令對於查詢系統中使用者的資訊很有用:
db.runCommand('usersInfo'):顯示一個或多個 MongoDB 使用者賬戶的資訊
所需許可權
要執行上述命令,您需要使用具有多種不同許可權操作的賬戶登入到 MongoDB。您所需的具體許可權取決於您需要使用的命令。
要獲取其他使用者的資訊,您當前的使用者必須啟用以下許可權操作:
要建立新使用者,您當前的使用者必須啟用以下許可權操作:
要更改使用者的密碼或賬戶詳情,您可能需要以下許可權:
changeOwnPassword許可權操作,用於更改您自己的賬戶密碼changeOwnCustomData許可權操作,用於更改您自己的賬戶的自定義資料changePassword許可權操作,用於更改其他使用者的密碼changeCustomData許可權操作,用於更改其他使用者的自定義資料
本指南不涉及角色管理,因此不需要 grantRole 和 revokeRole 許可權操作。
要刪除使用者賬戶,您當前的使用者必須啟用以下許可權操作:
瞭解 MongoDB 如何實現使用者和身份驗證
在我們開始建立和管理賬戶之前,花一些時間熟悉 MongoDB 如何定義和儲存這些資訊會很有幫助。
在 MongoDB 中,使用者賬戶是賬戶使用者名稱與特定身份驗證資料庫的組合。身份驗證資料庫僅僅是定義使用者的資料庫,並不意味著範圍或許可權上的限制。身份驗證資料庫是用於管理其他資料的常規資料庫,並非特殊的專用資料庫。
使用者賬戶名在其身份驗證資料庫中必須是唯一的。但是,相同的使用者名稱可以與不同的身份驗證資料庫一起重複使用,以建立新的、不同的使用者賬戶。
由於這種設計,賬戶只能透過包含使用者名稱和身份驗證資料庫來準確識別。要對賬戶進行身份驗證,還需要能夠提供與賬戶關聯的憑據。這通常是密碼,但也可以是證書。
如何建立使用者?
現在我們已經瞭解了 MongoDB 如何概念化使用者賬戶,我們可以討論如何建立新使用者。請記住,登入到您的 MongoDB 伺服器時,使用的使用者應具有適當的許可權以便跟隨操作。
要建立新使用者,您必須首先切換到您想用作新使用者身份驗證資料庫的資料庫。
首先,您可以透過輸入以下命令獲取系統中已配置的資料庫列表:
show dbs
admin 0.000GBconfig 0.000GBlocal 0.000GB
使用 use 命令切換到使用者將關聯的資料庫:
use admin
switched to db admin
要建立一個新使用者,您可以使用 db.createUser() 方法或 createUser 資料庫命令。無論哪種方式,您都需要在一個 user 物件中傳遞使用者名稱(user 欄位)、密碼(pwd 欄位)以及使用者應新增到的角色陣列(roles 鍵)。
要使用 db.createUser() 方法建立一個名為 tom 的新使用者,密碼設定為 hellothere,角色陣列為空,您可以輸入:
db.createUser({user: "tom",pwd: "hellothere",roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
使用 createUser 資料庫命令執行相同的操作將如下所示:
db.runCommand({createUser: "tom",pwd: "hellothere",roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
這兩種不同的選項非常相似,因此我們接下來將只在適用情況下展示資料庫方法。但是,如果您偏好資料庫命令語法,可以在 MongoDB 命令參考文件中找到每個相關命令。
在上述命令中,我們明確地在 user 物件內聯定義了密碼。為了防止密碼被記錄和檢索,您可以在 user 文件中改用 passwordPrompt() 方法,以便在執行命令時讓 MongoDB 互動式地提示您輸入密碼。密碼將不可見,因此您的命令歷史記錄將保持乾淨。
db.createUser({user: "tom",pwd: passwordPrompt(),roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }
請記住,如果您未啟用 TLS/SSL,密碼仍將以純文字形式傳送到伺服器。
如何顯示現有使用者?
接下來,我們來看看如何查詢現有使用者的資訊。
要返回多個使用者,您可以使用 db.getUsers() 方法來顯示當前資料庫中的所有使用者。首先,切換到您感興趣的資料庫進行查詢:
use admin
接下來,使用 db.getUsers() 方法返回與當前資料庫關聯的所有使用者:
db.getUsers()
[{"_id" : "admin.root","userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),"user" : "root","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]},{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","roles" : [ ],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]}]
要額外顯示每個使用者的憑據資訊,請向該方法傳遞一個物件,並將 showCredentials 鍵設定為 true:
use admindb.getUsers({showCredentials: true})
[{"_id" : "admin.root",. . ."credentials" : {"SCRAM-SHA-1" : {"iterationCount" : 10000,"salt" : "WpB0H4f7dG8XlCDyaVzarA==","storedKey" : "b11nA1+mGo3+Tr8P//u3NEdJLHk=","serverKey" : "3xE8o663hjqySrMCQcXjSxmjmhk="},"SCRAM-SHA-256" : {"iterationCount" : 15000,"salt" : "UtsfNRedf2ek5tbWFoGs2g52U0H7Na44wV4rYA==","storedKey" : "mz9/qHnI79pNAIQm0MZTKZ0U3qFk0xhUDd2grvKtMdI=","serverKey" : "c/sA4j+I/29Ea1y07zxoMcBgHFoYTUAa6luX3Z9sToQ="}},. . .},{"_id" : "admin.tom",. . ."credentials" : {"SCRAM-SHA-1" : {"iterationCount" : 10000,"salt" : "qCbxWQSGt3QoN3S1aM5AEg==","storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=","serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="},"SCRAM-SHA-256" : {"iterationCount" : 15000,"salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==","storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=","serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="}},. . .}]
要查詢符合特定條件的使用者,您可以傳遞一個物件,該物件定義一個 filter 鍵來定義匹配條件。
例如,要獲取當前資料庫中所有具有 root 角色的使用者的資訊,您可以輸入:
use admindb.getUsers({filter: {"roles.role": "root"}})
[{"_id" : "admin.root","userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),"user" : "root","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]}]
要獲取特定使用者,您可以改用 db.getUser() 方法。它與 db.getUsers() 方法類似,但只返回單個使用者。您不是向該方法傳遞一個物件,而是傳遞一個包含您希望檢索的使用者名稱的字串。
use admindb.getUser("tom")
{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","roles" : [ ],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]}
您可以選擇性地包含一個額外的 args 物件,透過將以下鍵設定為 true 來指定您想要的其他資訊:
showCredentials:除常規輸出外,還顯示憑據資訊showPrivileges:除常規輸出外,還顯示許可權資訊showAuthenticationRestrictions:除常規輸出外,還顯示賬戶的身份驗證限制
例如,您可以透過輸入以下命令告訴 MongoDB 提供所有上述資訊:
use admindb.getUser("tom",{showCredentials: true,showPrivileges: true,showAuthenticationRestrictions: true})
{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"],"credentials" : {"SCRAM-SHA-1" : {"iterationCount" : 10000,"salt" : "qCbxWQSGt3QoN3S1aM5AEg==","storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=","serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="},"SCRAM-SHA-256" : {"iterationCount" : 15000,"salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==","storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=","serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="}},"roles" : [ ],"inheritedRoles" : [ ],"inheritedPrivileges" : [ ],"inheritedAuthenticationRestrictions" : [ ],"authenticationRestrictions" : [ ]}
如何更改 MongoDB 使用者的密碼?
要更改使用者密碼,您可以使用 db.changeUserPassword() 方法。同樣,在執行命令之前,您必須切換到使用者的身份驗證資料庫。
db.changeUserPassword() 方法接受兩個引數:您希望更改的賬戶的使用者名稱和賬戶的新密碼。
例如,要將使用 admin 資料庫進行身份驗證的使用者 tom 的密碼更改為 secretpassword,您可以輸入:
use admindb.changeUserPassword("tom", "secretpassword")
就像 db.createUser() 方法一樣,您可以將 passwordPrompt() 方法用作第二個引數,而不是內聯提供密碼。當命令執行時,MongoDB 將提示您輸入密碼。
use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:
如何更改其他使用者賬戶詳情?
要更改與使用者賬戶關聯的其他資訊,您可以使用 db.updateUser() 方法。在更新使用者詳情之前,請確保您已切換到使用者的身份驗證資料庫。
db.updateUser() 方法要求您指定使用者名稱,然後提供一個包含您希望更新的資料的物件。您選擇更新的任何欄位都將完全被新資訊替換,因此如果您只希望新增新資訊,請確保在物件中同時包含原始資料和新資料。
您在命令中包含的帶有更改資訊的物件可以包含許多不同的欄位。我們來逐一介紹它們:
customData:與使用者賬戶關聯的任意資料。roles:授予使用者的角色。通常,最好使用db.grantRolesToUser()和db.revokeRolesFromUser()方法來控制角色成員資格,而不是使用此鍵進行更新,因為您可以單獨新增和刪除角色。pwd:使用者密碼。如果只需要更新此欄位,使用db.ChangeUserPassword()方法通常更簡單。authenticationRestrictions:指定賬戶的限制,可以限制使用者可以連線的 IP 地址來源或目標。此鍵的值是一個物件或陣列,定義了clientSource和/或serverAddress,其中包含指定有效 IP 地址或範圍的陣列。在 MongoDB 關於身份驗證限制的文件中瞭解更多資訊。mechanisms:用於憑據的特定身份驗證機制。可以設定為SCRAM-SHA-1或SCRAM-SHA-256中的一個或兩者,但只有在當前未提供新密碼的情況下,才能更改為當前機制的子集。passwordDigestor:指定哪個元件處理使用者密碼。可以是server(預設)或client。
舉例來說,我們可以透過更改 authenticationRestrictions 欄位,更新對 admin 資料庫進行身份驗證的 tom 賬戶,使其只能從託管伺服器本身的同一臺計算機登入。
use admindb.updateUser("tom", {authenticationRestrictions: [ {clientSource: ["127.0.0.1", "::1"],serverAddress: ["127.0.0.1", "::1"]} ]})
現在,如果您要求 MongoDB 顯示有關使用者的相關資訊,它將顯示賬戶的其他限制。
use admindb.getUser("tom", {showAuthenticationRestrictions: true})
{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"],"roles" : [ ],"authenticationRestrictions" : [{"clientSource" : ["127.0.0.1","::1"],"serverAddress" : ["127.0.0.1","::1"]}],"inheritedRoles" : [ ],"inheritedPrivileges" : [ ],"inheritedAuthenticationRestrictions" : [ ]}
要撤銷這些限制,我們可以再次執行該命令,使用一個空陣列。
use admindb.changeUser("tom", {authenticationRestrictions: []})
如何刪除 MongoDB 使用者?
要刪除 MongoDB 使用者賬戶,您可以使用 db.dropUser() 方法。在刪除使用者之前,請務必連線到該使用者的身份驗證資料庫。
要執行 db.dropUser() 方法,您需要提供您希望刪除的使用者的名稱。
db.dropUser("tom")
成功刪除後,MongoDB 將返回 true。
true
如果賬戶在當前資料庫中不存在,它將返回 false。
結論
MongoDB 的使用者管理和身份驗證配置允許您控制誰可以連線到您的伺服器以及他們的使用者屬性是什麼。在後續文章中,我們將透過解決使用者管理的授權部分來介紹如何限制使用者的訪問級別。
如果您正在使用 MongoDB,請檢視 Prisma 的MongoDB 聯結器!您可以使用Prisma Client自信地管理生產環境中的 MongoDB 資料庫。
要開始使用 MongoDB 和 Prisma,請檢視我們的從零開始指南或如何新增到現有專案。
常見問題
要列出 MongoDB 中的現有使用者,您可以使用 db.getUsers() 方法來顯示當前資料庫中的所有使用者。
語法如下所示:
use admindb.getUsers()
有關db.getUsers() 的更多詳細資訊。
為了在 MongoDB 中建立資料庫管理員使用者,您需要使用 admin 資料庫中的 db.createUser() 方法。
以下展示了用於建立資料庫管理員的語法。
use admindb.createUser({ user: "tom",pwd: "hellothere",roles:[{role: "dbAdmin" , db:"admin"}]})
要刪除 MongoDB 使用者,您可以使用 db.dropUser() 方法。這需要在 admin 資料庫中完成,語法如下所示:
use admindb.dropUser("tom")
要獲取 MongoDB 中所有現有使用者的列表,您可以使用 db.getUsers() 方法。
基本語法如下所示:
use admindb.getUsers()
要查詢特定使用者,您可以使用 db.getUser() 方法,並將 showPrivileges 引數設定為 true。
基本語法如下所示:
use admindb.getUser("tom",{showPrivileges: true,})
