今天一個現場運維部署羣裏面發現一些應用日誌報錯,如圖:
那個項目的負責人當時有其餘事,就@我幫忙解決一下。我第一反應是沒有受權,可是運維人員說已經執行過受權語句了,而且能夠在命令行用那個用戶名密碼登陸,也能夠看到集合(他沒有find數據只是show collections看了一下集合列表)。我很久沒有看MongoDB的東西了,MongoDB的內置角色權限細節已經記不清了,因此看到羣裏他發出來的受權語句也沒有發現角色不對,致使後來走了一些彎路。特此記錄下,防止之後再弄錯。
如題所示,錯誤是當前用戶沒有find讀取數據的權限,運維人員的受權語句以下:mongodb
use userDb; db.createUser( { user:"userName", pwd:"userPwd", roles: [{ role:"dbAdmin", db:"userDb"} ] } )
實際上此時使用該用戶在命令行登陸以後,也是沒有權限find非系統集合數據的。因爲這個應用只是對一個普通集合的數據進行讀寫,因此正確的作法是把角色設爲readWrite,更新語句爲數據庫
> use userDb switched to db userDb > db.updateUser("userName",{roles:[{"role":"readWrite","db":"userDb"}]})
你們都知道MongoDB經過基於角色的受權來授予對數據和命令的訪問權限,並提供了一些內置角色來知足平常對數據庫的不一樣級別的訪問。
用戶角色有read
、readWrite
數據庫系統管理員角色有dbAdmin
、dbOwner
、userAdmin
等等,更多角色及每一個角色對應的權限詳見mongdb內置角色
運維人員弄混的角色就是dbAdmin
、dbOwner
,由於咱們測試庫中有時候爲了方便操做,會給的權限比較高,因此常常給用戶授予管理員的角色dbOwner,少數授予了dbAdmin,運維人員給新環境寫受權語句的時候參考了測試庫的角色,可是沒弄清楚這兩個角色的區別:app
collStats dbHash dbStats find killCursors listIndexes 等等
該角色對非系統集合沒有徹底讀取的訪問權限,提供如下操做:運維
bypassDocumentValidation collMod collStats compact convertToCapped createCollection createIndex 等等