(一)用戶管理
(1)建立用戶
1.要添加用戶,MongoDB提供了db.createUser()方法。添加用戶時,能夠爲用戶分配角色,授予權限。
2.在數據庫中建立的第一個用戶應該具備管理其餘用戶的權限。
3.添加用戶時,能夠在特定的數據庫中建立該用戶,該數據庫是用戶的身份驗證數據庫。用戶能夠在不一樣的數據庫之間擁有特權,也就是說,用戶的權限不限於其身份驗證數據庫,經過分配其餘數據庫中的角色,在一個數據庫中建立的用戶能夠對其它數據庫執行操做。
4.用戶名和身份驗證數據庫用做該用戶的惟一標識,也就是說,若是兩個用戶具備相同的名稱,可是在不一樣的數據庫中建立,則他們是2個不一樣的用戶,若是打算讓一個用戶對多個數據庫擁有操做權限,請在適當的數據庫中建立一個具備角色的單個用戶,而不是在不一樣的數據庫中屢次建立該用戶。數據庫
例子1:在lijiamandb數據庫中,建立用戶lijiaman,對該庫具備讀寫權限。服務器
use lijiamandb db.createUser( { user:"lijiaman", pwd:passwordPrompt(), roles:[{role:"readWrite",db:"lijiamandb"}] } )
例子2:在reportdb數據庫中,建立用戶report,對reportdb數據庫具備讀寫權限,對lijiamandb具備讀的權限。app
use reportdb db.createUser( { user:"report", pwd:passwordPrompt(), roles:[ {role:"readWrite",db:"reportdb"}, {role:"read",db:"lijiamandb"} ] } )
(2)刪除用戶ide
db.dropUser("user_name")
(3)修改用戶密碼
例如,把lijiamandb數據庫中的user1用戶的密碼改成123456。工具
use lijiamandb db.changeUserPassword("user1", "123456")
(二)認證機制
從MongoDB4.0版本開始,MongoDB刪除了MONGODB-CR認證方式,MongoDB支持以下認證方式:
--SCRAM(默認方式)
--x.509spa
(三)基於角色的訪問控制
1.MongoDB使用基於角色訪問控制(Role-Based Access Control,RBAC)來管理對MongoDB系統的訪問,授予用戶一個或者多個角色,來決定用戶對數據庫資源的訪問以及操做權限。
MongoDB默認不啓用訪問控制,管理員能夠再啓動中使用--auth或者配置文件中使用security.authorization參數來啓用訪問控制。
2.角色被授予權限,從而對資源執行指定的操做。
權限由指定的資源和對該資源容許的操做組成,一個資源能夠是一個數據庫、集合、或者是集羣。若是資源師集羣,則相關操做會影響系統狀態。rest
(四)數據庫內置角色
MongoDB在每個數據庫上提供內置的Database User Roles和Database Administration Roles,僅僅對admin數據庫提供全部內置角色。
(4.1)Database User Roles
(4.1.1)read
讀取全部非系統集合和system.js的功能。code
該角色包含如下操做:
changeStream
collStats
dbHash
dbStats
find
killCursors
listIndexes
listCollectionsblog
(4.1.2)readWrite
在read角色的基礎上,增長了對全部非系統集合和system.js集合的修改功能索引
該角色包含如下操做:
collStats
convertToCapped
createCollection
dbHash
dbStats
dropCollection
createIndex
dropIndex
find
insert
killCursors
listIndexes
listCollections
remove
renameCollectionSameDB
update
(4.2)Database Administration Roles
(4.2.1)dbAdmin
提供執行管理任務的能力,例如與schema相關的任務,索引和統計信息收集。該角色沒有用戶和角色管理的權限。
(4.2.2)dbOwner
數據庫全部者能夠對數據庫執行任何操做,該角色由readWrite,dbAdmin,userAdmin角色組合受權。
(4.2.3)userAdmin
提供在當前數據庫上建立和修改角色和用戶的功能,因爲該角色容許用戶向任何用戶(包括本身)授予任何特權,該角色間接提供了超級用戶的權限(後面理解不了,附原文)。
原文:Provides the ability to create and modify roles and users on the current database. Since the userAdmin role allows users to grant any privilege to any user, including themselves, the role also indirectly provides superuser access to either the database or, if scoped to the admin database, the cluster.
(4.3)Cluster Administration Roles
僅僅能夠對建立在admin數據庫中的用戶授予集羣管理角色。
(4.3.1)clusterAdmin
最大的集羣管理權限,該角色包含clusterManager、clusterMonitor、hostManager角色,此外,還提供了dropDatabase操做權限。
(4.3.2)clusterManager
提供對集羣的管理和監視操做,具備此角色的用戶能夠訪問config和local數據庫,分別用於分片和複製。
(4.3.3)clusterMonitor
提供對集羣監視的只讀訪問。
(4.3.4)hostManager
提供監視和管理服務器的功能。
(4.4)Backup and Restoration Roles
僅僅能夠對建立在admin數據庫中的用戶授予備份與恢復角色。
(4.4.1)backup
提供了最小的使用MongoDB Cloud Manager,Ops Manager,mongodump工具有份數據庫的權限。
(4.4.2)restore
提供了使用mongorestore恢復數據的權限。
(4.5)All-Database Roles
僅僅能夠對建立在admin數據庫中的用戶授予對所有數據庫操做的角色。
(4.5.1)readAnyDatabase
除了local和config數據庫,提供了對其它全部數據庫只讀(read)的權限。
(4.5.2)readWriteDatabase
除了local和config數據庫,提供了對其它全部數據庫讀寫(readWrite)的權限。
(4.5.3)userAdminAnyDatabase
除了local和config數據庫,提供了對其它全部數據庫userAdmin角色的權限。
(4.5.4)dbAdminAnyDatabase
除了local和config數據庫,提供了對其它全部數據庫dbAdmin角色的權限。
(4.6)Superuser Roles
如下角色具備授予任意數據庫中任意用戶任意權限的能力,這意味着具備如下角色的用戶能夠授予本身任何權限。
-- 在admin數據庫中,具備dbOwner角色的用戶
-- 在admin數據庫中,具備userAdmin角色的用戶
-- 具備userAdminAnyDatabase角色的用戶
(4.6.1)root
root角色包含了如下角色:
readWriteAnyDatabase
dbAdminAnyDatabase
userAdminAnyDatabase
clusterAdmin
restore
backup
(4.7)Internal Role
(4.7.1)__system
MongoDB將該角色分配給集羣成員,例如副本集成員和mongos實例。授予該角色的用戶可以對任意數據庫進行任意操做,不要將此角色授予給應用程序用戶。
(五)角色查看、授予、撤銷
(5.1)前提條件
若是要受權角色給其它用戶,必需要有grantRole權限;
若是要回收角色,必需要有revokeRole權限;
若是查看角色信息,必需要有viewRole權限。
(5.2)查看用戶
(5.2.1)可使用db.getUsers()查看某個數據庫中的全部用戶
use lijiamandb rstest:PRIMARY> db.getUsers() [ { "_id" : "lijiamandb.lijiaman", "userId" : UUID("3372dc4f-6c83-43fd-8693-a0845e43c16a"), "user" : "lijiaman", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }, { "_id" : "lijiamandb.user1", "userId" : UUID("95fd5c9a-82d5-48dc-8cdc-0fea31e77d13"), "user" : "user1", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] }, { "_id" : "lijiamandb.user2", "userId" : UUID("f2a1cbf1-9e4d-46ab-b7c5-3a4bd6806465"), "user" : "user2", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } ]
(5.2.2)可使用db.getUser("user1")查看數據庫中特定用戶
use lijiamandb rstest:PRIMARY> db.getUser("user1") { "_id" : "lijiamandb.user1", "userId" : UUID("95fd5c9a-82d5-48dc-8cdc-0fea31e77d13"), "user" : "user1", "db" : "lijiamandb", "roles" : [ { "role" : "readWrite", "db" : "lijiamandb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } rstest:PRIMARY>
(5.3)查看角色
經過查看角色,能夠看到角色的權限(action)。
use lijiamandb rstest:PRIMARY> db.getRole( "readWrite", { showPrivileges: true } )
(5.4)角色授予
use lijiamandb db.grantRolesToUser( "lijiaman", [ { role: "read", db: "lijiaman" } ] )
(5.5)角色回收
use lijiamandb db.revokeRolesFromUser( "lijiaman", [ { role: "readWrite", db: "lijiamandb" } ] )
【完】