1. 報錯本質

該報錯表示:當前執行命令的 MongoDB 用户,在admin數據庫(MongoDB 的系統管理數據庫)中沒有被授予執行該命令所需的權限,MongoDB 的訪問控制(認證)機制拒絕了此次操作。

2. 常見觸發原因

原因類型

具體説明

權限缺失

用户僅被授予業務庫(如 test、appdb)權限,無 admin 庫的對應權限(如 read、dbAdmin、clusterAdmin)

認證數據庫錯誤

用户創建在 admin 庫,但執行命令時未在 admin 庫認證(比如誤在 test 庫認證)

角色賦予錯誤

執行的命令需要高權限角色(如 clusterAdmin),但僅給了低權限角色(如 readWrite)

未認證直接執行命令

MongoDB 啓用了訪問控制(auth=true),但客户端未登錄就執行需權限的命令

權限範圍不足

比如執行listDatabases需要readAnyDatabase角色,卻只給了read角色

二、分步驟解決方法

步驟 1:定位報錯的核心信息(關鍵前提)

先從 MongoDB 日誌中提取 2 個關鍵信息,精準定位問題:

 

# 1. 查看MongoDB日誌(Linux示例,Windows可直接打開日誌文件)
grep "not authorized on admin" /var/log/mongodb/mongod.log

# 2. 從日誌中找到:
# - 執行的具體命令:如 "command: { listDatabases: 1 }"
# - 執行命令的用户:如 "user: { user: 'appuser', db: 'admin' }"

 

 

示例日誌片段:

 

2025-12-24T10:00:00.000+0800 E COMMAND  [conn123] command admin.listDatabases requires authentication but user appuser is not authorized on admin to execute command { listDatabases: 1, lsid: { id: UUID("xxx") }, $db: "admin" }

 

步驟 2:以超級管理員身份登錄 MongoDB

首先需要用擁有root權限的用户登錄(若沒有 root 用户,先創建):

場景 A:已有 root 用户(推薦)

# 登錄admin數據庫(root用户默認創建在admin庫)
mongosh admin -u root -p 你的root密碼

 

場景 B:無 root 用户(需臨時關閉認證)

如果尚未創建管理員用户,需先關閉訪問控制,創建 root 用户:

 

  1. 停止 MongoDB 服務:



# Linux
systemctl stop mongod
# Windows
net stop MongoDB
  1. 修改 MongoDB 配置文件(mongod.conf),關閉認證:
# 找到security配置段,註釋或修改authorization為false
security:
  # authorization: enabled  # 註釋掉或改為false
  authorization: false
  1. 重啓 MongoDB 服務:






# Linux
systemctl start mongod
# Windows
net start MongoDB
  1. 本地無認證登錄,創建 root 用户:
// 進入admin數據庫
use admin
// 創建root超級管理員(密碼需符合複雜度要求)
db.createUser({
  user: "root",
  pwd: "你的強密碼", // 如Root@123456
  roles: [{ role: "root", db: "admin" }] // root角色擁有所有權限
})
  1. 恢復認證配置:將authorization改回enabled,重啓 MongoDB 服務。

步驟 3:檢查並賦予用户正確的權限

第一步:查看報錯用户的現有權限

// 切換到admin數據庫
use admin
// 查看用户權限(替換為你的報錯用户名)
db.getUser("appuser")

// 示例輸出(權限不足的情況):
{
  "_id" : "admin.appuser",
  "user" : "appuser",
  "db" : "admin",
  "roles" : [ { "role" : "readWrite", "db" : "appdb" } ] // 僅擁有appdb的讀寫權限,無admin庫權限
}

 

第二步:根據命令需求賦予對應權限

MongoDB 的權限遵循 “最小權限原則”,不要隨意賦予 root,根據執行的命令選擇對應角色:

 

需執行的命令 / 操作

所需角色(admin 庫)

賦予命令示例

列出所有數據庫(listDatabases)

readAnyDatabase

db.grantRolesToUser("appuser", [{ role: "readAnyDatabase", db: "admin" }])

集羣管理(複製集 / 分片)

clusterAdmin

db.grantRolesToUser("appuser", [{ role: "clusterAdmin", db: "admin" }])

管理所有數據庫用户

userAdminAnyDatabase

db.grantRolesToUser("appuser", [{ role: "userAdminAnyDatabase", db: "admin" }])

所有數據庫的管理權限

dbAdminAnyDatabase

db.grantRolesToUser("appuser", [{ role: "dbAdminAnyDatabase", db: "admin" }])

超級管理員(應急場景)

root

db.grantRolesToUser("appuser", [{ role: "root", db: "admin" }])

示例:解決 “listDatabases” 命令權限不足

 

// 給appuser賦予admin庫的readAnyDatabase角色
use admin
db.grantRolesToUser(
  "appuser",  // 報錯的用户名
  [{ role: "readAnyDatabase", db: "admin" }]  // 所需角色
)

 

步驟 4:驗證權限是否生效

重新用報錯用户登錄,執行原命令,檢查是否報錯:

 

# 務必指定admin庫認證(用户創建在admin庫)
mongosh admin -u appuser -p 你的密碼

# 執行原報錯命令(如listDatabases)
show dbs  # 等價於db.runCommand({ listDatabases: 1 })

# 若能正常列出數據庫,説明權限生效

 

三、避坑指南:常見錯誤排查

  1. 認證數據庫錯誤:
      若用户創建在admin庫,必須用mongosh admin -u 用户名 -p登錄,而非mongosh test -u 用户名 -p(即使要操作 test 庫,認證仍需在 admin 庫)。
  2. 角色賦予到錯誤數據庫:
      集羣 / 全局類角色(如 clusterAdmin、readAnyDatabase)必須在admin庫賦予,不能賦予到業務庫(如 appdb)。
  3. 權限回收(如需):


use admin
db.revokeRolesFromUser("appuser", [{ role: "root", db: "admin" }])