當 MongoDB 以 --auth 參數啟用認證後,使用 Mongoose 連線時常會遇到「驗證成功但隨後因權限不足而報錯」的情況。錯誤日誌通常顯示:Successfully authenticated as principal admin on root 緊接著出現 Unauthorized not authorized on root to execute command { listIndexes: ... }。
MongoDB 3.0 版本後引入了 SCRAM-SHA-1 認證機制,且使用者帳號綁定在特定資料庫(authentication database)。Mongoose 連線字串若未正確指定認證資料庫,驗證雖通過,但後續操作會因權限不足而失敗。常見錯誤在於將認證資料庫誤設為 root 或目標業務資料庫,而非建立使用者時所在的資料庫(通常為 admin)。
mongoose.connect('mongodb://admin:111111@localhost:27017/yourDB?authSource=admin');
關鍵參數 authSource=admin 告訴驅動程式去 admin 資料庫驗證帳號密碼。
const options = {
user: 'admin',
pass: '111111',
authSource: 'admin', // 必須指定
useNewUrlParser: true,
useUnifiedTopology: true
};
mongoose.connect('mongodb://localhost:27017/yourDB', options);
為避免 listIndexes 等指令被拒,建議給予使用者 readWrite 或 dbOwner 角色於目標業務資料庫,並在 admin 資料庫建立使用者時賦予 userAdminAnyDatabase 或 root 角色(視安全需求而定)。
admin 資料庫:use admindb.getUsers()root 或 admin 而非實際業務資料庫。authSource 參數,需升級。依照上述設定調整後,即可解決「驗證成功但無權執行指令」的問題,實現穩定的生產環境連線。