Mongodb

對於 mongo,無法使用錯誤命令 createUser 需要身份驗證來創建管理員以外的使用者:

  • March 10, 2022

這是我用來在 MongoDB 中創建使用者帳戶的腳本:

mongo <<EOF
use admin;
db.createUser({user:ram", pwd: "ram123!", roles:['root']});
db.createUser({user:"sam", pwd: "sam123!", roles:[{db:"config", role:'readWrite'}]});
EOF

這適用於創建第一個使用者,但不適用於第二個使用者。這是返回的錯誤:

connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f648b868-7863-4d5c-9912-e3e87b24f4e8") }
MongoDB server version: 4.4.6
switched to db admin
Successfully added user: { "user" : "ram", "roles" : [ "root" ] }
uncaught exception: Error: couldn't add user: command createUser requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1386:11
@(shell):1:1
bye

問題似乎是創建帳戶時預期的不同數據庫。第一個ram是針對admin數據庫創建的。第二個,sam預計將在config數據庫上進行,但您已連接到admin,這使得這不可能。

為了正確執行此操作,您需要首先連接到config數據庫並在那里為有權訪問config.

在數據庫上創建第一個可以管理使用者和角色(使用者管理員admin)的使用者(使用者“ram”,您已成功創建)後,您需要執行以下步驟來創建其他使用者:

從shell關閉mongod實例:mongo

use admin
db.shutdownServer();

退出外殼。

使用以下選項mongod重新開始:auth

--auth選項啟用授權以控制使用者對數據庫資源和操作的訪問。啟用授權後,MongoDB 要求所有客戶端首先對自己進行身份驗證,以確定客戶端的訪問權限。

mongod --auth --port 27017 --dbpath ...

從現在開始,連接到此實例的客戶端必須將自己驗證為 MongoDB 使用者。客戶端只能執行由其分配的角色確定的操作。

mongo從shell連接到實例:

mongo --port 27017  --authenticationDatabase "admin" -u "ram" -p "rams_password"

現在您已將自己認證為使用者管理員。因此,您可以創建具有各種角色的其他使用者。

現在根據需要創建其他使用者(例如):

use db2
db.createUser(
 {
   user: "db2User",
   pwd:  "db2_pass",
   roles: [ { role: "readWrite", db: "db2" } ]
 }
)

這將創建一個使用者“db2User”,該使用者在數據庫“db2”上具有“readWrite”角色。注意;use db2之前的命令 createUser()這意味著該使用者的身份驗證數據庫是“db2”。當該使用者需要向“db2”數據庫讀取或寫入數據時,他/她需要針對該數據庫進行身份驗證,例如從mongoshell 中:

mongo --port 27017  --authenticationDatabase "db2" -u "db2User" -p "db2_pass"

請注意,您的身份驗證數據庫可能與您在 中指定的數據庫不同roles,例如:

use db2
db.createUser(
 {
   user: "mongoUser",
   pwd:  "mongo_pass",
   roles: [ { role: "read", db: "myDB" } ]
 }
)

錯誤:

您收到的錯誤是因為您在創建新使用者之前尚未將自己認證為使用者管理員

要詳細了解這一點,您需要熟悉身份驗證和授權的MongoDB 安全方面。

引用自:https://dba.stackexchange.com/questions/292514