MongoDB 使用者與許可權管理

HuDu發表於2021-07-27

一、常用許可權

許可權 說明
read 允許使用者讀取指定資料庫
readWrite 允許使用者讀寫指定資料庫
userAdmin 允許使用者向 system.users 集合寫入,可以在指定資料庫裡建立、刪除和管理使用者
dbAdmin 允許使用者在指定資料中執行管理函式,如索引建立、刪除,檢視統計或訪問 system.profile
clusterAdmin 必須在 admin 資料庫中定義,賦予使用者所有分片和複製集相關函式和管理許可權
readAnyDatabase 必須在 admin 資料庫中定義,賦予使用者所有資料庫的讀取許可權
readWriteAnyDatabase 必須在 admin 資料庫中定義,賦予使用者所有資料庫的讀寫許可權
userAdminAnyDatabase 必須在 admin 資料庫中定義,賦予使用者所有資料庫的 userAdmin 許可權
dbAdminAnyDatabase 必須在 admin 資料庫中定義,賦予使用者所有資料庫的 dbAdmin 許可權
root 必須在 admin 資料庫中定義,超級賬號,超級許可權

二、建立管理使用者

    MongoDB 有一個使用者管理機制,簡單描述為管理使用者組,這個組的使用者是專門為管理普通使用者而設的,暫且稱之為管理員。
    管理員通常沒有資料庫的讀寫許可權,只有操作使用者的許可權,我們只要賦予管理員`userAdminAnyDatabase`角色即可。另外管理員賬戶必須在 admin 資料庫下建立。
    由於使用者被建立在哪個資料庫下,就只能在哪個資料庫登入,所以把所有的使用者都建立在 admin 資料庫下。這樣我們切換資料庫時就不需要頻繁進行登入了。
    先 `use admin` 切換至 admin 資料庫進行登入,登入後再 use 切換其他資料庫進行操作即可。第二次的 use 就不要再次登入了。MongoDB設定 use 第二個資料庫時如果登入使用者許可權比較高就可以直接操作第二個資料庫,而不需要登入。

2.1 切換資料庫

管理員需要在 admin 資料庫下建立,所以我們需要先切換至 admin 資料庫。

MongoDB 使用者與許可權管理

2.2 檢視使用者

通過 db.system.users.find() 函式檢視 admin 資料庫中所有使用者資訊,目前 admin 資料庫中並沒有使用者,所以查無結果。

MongoDB 使用者與許可權管理

2.3 建立使用者

在 MongoDB 中可使用 db.createUser({使用者資訊})函式建立使用者

db.createUser({
    user: "<name>",
    pwd: "<cleartext password>",
    customData: { <any information> },
    roles: [
        { role: "<role>", db: "<database>" } | "<role>",
        ...
    ]
});
  • user: 使用者名稱
  • pwd: 密碼
  • customData: 存放使用者相關的自定義資料,該屬性也可忽略
  • roles: 陣列型別,配置使用者的許可權

例項如下:

db.createUser({user:"uadd",pwd:"uadd",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

MongoDB 使用者與許可權管理

2.4 重啟服務

管理員賬戶建立完成後,需要重啟 MongoDB,並開啟身份驗證功能。
先通過db.shutdownServer()函式關閉服務

MongoDB 使用者與許可權管理

$ mongod -f /opt/mongodb/bin/mongodb.conf --auth

或者在原先的mongodb.conf檔案中進行追加配置

# 資料存放目錄
dbpath = /opt/mongodb/data/db
# 日誌檔案存放目錄
logpath = /opt/mongodb/logs/mongodb.log
# 以追加的方式記錄日誌
logappend = true
# 埠預設為 27017
port = 27017
# 對訪問 IP 地址不做限制,預設為本機地址
bind_ip = 0.0.0.0
# 以守護程式的方式啟動,即在後臺執行
fork = true
# 開啟身份認證
auth = true

使用 db.auth(“使用者名稱”,”密碼”)進行身份認證,返回結果 1,表示認證成功,0 表示失敗。

MongoDB 使用者與許可權管理

三、建立普通使用者

需求:建立一個 test 資料庫,給這個資料庫新增一個使用者,使用者名稱為 testuser,密碼為 123456,並授予該使用者對 test 資料庫的讀寫操作許可權。

3.1 管理員登入資料庫

普通使用者需要由管理員建立,所以先使用管理員使用者登入資料庫。

>use admin
switched to db admin
>db.auth("uadd","uadd")
1

3.2 建立資料庫

MongoDB 沒有特定建立資料庫的語法,在使用 use 切換資料庫時,如果對應的資料庫不存在,則直接建立並切換。

>use test
switched to db test

3.3 建立使用者

$ db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})

MongoDB 使用者與許可權管理

3.4 身份認證

登入成功後即可進行該使用者所擁有的角色對應的許可權的其他操作,執行以下語句測試該使用者的讀寫許可權是否可用。

>db.user.insert({"name":"zhangsan"})

MongoDB 使用者與許可權管理

四、更新使用者

    如果我們需要對已存在的使用者進行角色修改,可以使用 db.updateUser() 函式來更新使用者角色。注意:執行該函式需要當前使用者具有 userAdmin 或 userAdminAnyDatabase 或 root 角色。
db.updateUser("使用者名稱",{"roles":[{"roles":"角色名稱",db:"資料庫"},{"更新項2":"更新內容"}]})

比如給剛才的 `uadd` 使用者再新增 `readWriteAnyDatabase``dbAdminAnyDatabase`許可權。
>db.updateUser("uadd",{"roles":[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]})
>show users

MongoDB 使用者與許可權管理

更新密碼

更新使用者密碼有以下兩種方式,更新密碼時需要切換懂啊該使用者所在的資料庫。注意:需要使用具有 userAdmin 或 userAdminAnyDatabase 或 root 角色的使用者執行
使用 db.updateUser("使用者名稱",{"pwd":"新密碼"}) 函式更新密碼
使用 db.changeUserPassword("使用者名稱","新密碼") 函式更新密碼

刪除使用者

通過 db.dropUser()  函式可以刪除指定使用者,刪除成功以後會返回 true。刪除使用者時需要切換到該使用者所在的資料庫。注意:需要使用具有 userAdmin 或 userAdminAnyDatabase 或 root 角色的使用者才可以刪除其他使用者。

MongoDB 使用者與許可權管理

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章