MongoDB系列第四課:MongoDB數據庫、集合、文檔的操作
Mongodb作為時下最為熱門的數據庫,那么其安全驗證也是必不可少的,否則一個沒有驗證的數據庫暴露出去,任何人可隨意操作,這將是非常危險的。我們可以通過使用為MongoDB創建用戶的方式來降低風險。
MongoDB用戶權限列表
read |
允許用戶讀取指定數據庫 |
readWrite |
允許用戶讀寫指定數據庫 |
dbAdmin |
允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile |
userAdmin |
允許用戶向system.users集合寫入,可以在指定數據庫里創建、刪除和管理用戶 |
clusterAdmin |
只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限 |
readAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的讀權限 |
readWriteAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限 |
userAdminAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限 |
dbAdminAnyDatabase |
只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限 |
root |
只在admin數據庫中可用。超級賬號,超級權限 |
MongoDB用戶使用
一、 創建DB管理用戶
mongodb有一個用戶管理機制,簡單描述為,有一個管理用戶組,這個組的用戶是專門為管理普通用戶而設的,暫且稱之為管理員。
管理員通常沒有數據庫的讀寫權限,只有操作用戶的權限, 因此我們只需要賦予管理員userAdminAnyDatabase角色即可。
另外管理員賬戶必須在admin數據庫下創建,3.0版本后沒有admin數據庫,但我們可以手動use一個。注:use命令在切換數據庫時,如果切換到一個不存在的數據庫,MongodDB會自動創建該數據庫。
1.1 切換到admin庫
管理員需要在admin數據庫下創建,所以我們需要切換到admin數據庫。
1.2 查看admin中的用戶
可以通過db.system.users.find()函數來查看admin庫中的所有用戶信息。
目前在admin庫中沒有用戶,所以查無結果。
1.3 db.createUser函數
在MongoDB中可以使用db.createUser({用戶信息})函數創建用戶。
db.createUser({ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] });
1)user:新建用戶名。
2)pwd:新建用戶密碼。
3)customData:存放一些用戶相關的自定義數據,該屬性也可忽略。
4)roles:數組類型,配置用戶的權限。
1.4 創建管理員用戶
我們現在需要在admin庫中創建一個名為bjsxt的管理員用戶,密碼為bjsxtpwd。
db.createUser({user:'bjsxt',pwd:'bjsxtpwd',roles:[{role:'userAdminAnyDatabase',db:'admin'}])
創建成功后會看到如下提示:
1.5 重啟MongoDB
在管理員賬戶創建完成后,我們需要重新啟動MongoDB,並開啟驗證。
重新啟動函數:db.shutdownServer()。
1.6 使用權限方式啟動MongoDB
在默認的情況下MongoDB是不開啟用戶認證的。如果我們添加用戶,那么需要開啟用戶認證機制。通過修改mongodb.conf配置文件,在文件中添加auth=true即可。
修改完成后啟動MongoDB。
1.7 用戶認證
創建管理員后,需要認證方可使用該用戶,否則會提示需要認證。
認證函數:db.auth(‘用戶名’,’密碼’)
如果結果返回1,則表示認證成功,返回0則表示認證失敗。
登錄成功后可查詢用戶
二、 創建普通用戶
普通用戶由管理員創建。通常需要指定某個數據庫來操作。
2.1 需求
我們創建一個sxt數據庫,給這個數據庫添加一個用戶,用戶名為itsxt,密碼為itsxtpwd。並授予該用戶對sxt數據庫進行讀寫操作的權限。
2.2 使用管理員用戶登錄
普通用戶需要由管理員創建並授權。所以,我們首先做的就是用管理員賬戶登錄數據庫。
2.3 創建sxt數據庫
use命令切換數據庫時如果該庫不存在,那么則會創建該數據庫。
2.4 創建普通用戶
2.5 使用普通用戶
打開一個新的客戶端。
2.6 切換到sxt數據庫
由於我們是在sxt數據庫中創建的itsxt用戶,所以需要先切換到sxt庫。
2.7 登錄普通用戶
如果我們不登錄會發現無法對該數據庫進行插入操作。因為缺少用戶認證。
通過認證函數對用戶進行登錄認證。
認證成功后操作通過該用戶操作sxt庫。該用戶對sxt庫具備讀寫操作。
三、 更新用戶角色
如果我們需要對已存在的用戶的角色做修改,那么我們可以使用db.updateUser()函數來更新用戶角色。注意,該函數需要當前用戶具有userAdminAnyDatabase或者更高的權限。
3.1 更新角色語法格式
db.updateUser( "用戶名","roles":[{"role":"角色名稱"},{"更新項2":"更新內容"}])
3.2 需求
目前bjsxt管理員用戶只具備userAdminAnyDatabase用戶管理角色,我們為該用戶添加一個dbAdminAnyDatabase數據庫管理角色。
3.3 更新角色
db.updateUser("bjsxt",{roles : [{"role" : "userAdminAnyDatabase","db" : "admin"},{"role" : "dbAdminAnyDatabase","db" : "admin"}]})
如果沒有提示任何信息則表示更新成功。退出當前客戶端重新連接即可生效。
3.4 查看用戶信息
通過show users命令查看到bjsxt用戶的角色已經發生改變。
四、 更新用戶密碼
更新用戶密碼有兩種方式:
1)使用db.updateUser()函數更新密碼。
2)使用db.changeUserPassword()函數更新密碼
4.1 更新密碼方式一
使用db.upateUser()函數將bjsxt用戶的密碼修改為sxt
語法格式:db.updateUser("用戶名",{"pwd":"新密碼"})
4.2 更新密碼方式二
使用db.changeUserPassword()函數將bjsxt用戶的密碼修改為sxtpwd。
語法格式:db.changeUserPassword("用戶名","新密碼")
如果未提示任何信息則表示更新成功。退出當前客戶端重新連接認證即可。
重新使用bjsxt用戶登錄
五、 刪除用戶
通過db.dropUser()函數可刪除指定用戶。刪除成功后會返回true。在刪除用戶時需要切換到創建時用戶所指定的數據庫中才可以刪除。注意:需要使用具有userAdminAnyDatabse角色管理員用戶才可以刪除其他用戶。
5.1 需求
我們使用db.dropUser()函數將itsxt用戶刪除。
5.2 切換數據庫
itsxt用戶在sxt數據庫中,所以需要先切換到sxt數據庫。
5.3 通過函數刪除用戶
我們可以看到,該函數返回了true,表示刪除成功。