一、建立用戶:
1.1 語法格式:
pwd:密碼
customData: 用於描述帳戶信息
roles:指定用戶的角色,能夠用一個空數組給新用戶設定空角色;在roles字段,能夠指定內置角色和用戶定義的角色。
role裏的角色能夠選:
-
mongo>db.createUser(
-
{ user: "<name>",
-
pwd: "<cleartext password>",
-
customData: { <any information> },
-
roles: [
-
{ role: "<role>", db: "<database>" } | "<role>",
-
...
-
]}
-
)
-
> use admin
-
>db.createUser(
-
{ user:'useradmin',
-
pwd: '123456',
-
customData:{ "desc":"This user is for administrators"},
-
roles:[{role:'userAdminAnyDatabase',db:'admin'}]
-
})
pwd:密碼
customData: 用於描述帳戶信息
roles:指定用戶的角色,能夠用一個空數組給新用戶設定空角色;在roles字段,能夠指定內置角色和用戶定義的角色。
role裏的角色能夠選:
Built
-In Roles(內置角色):
.1. 數據庫用戶角色:read、readWrite;
.2. 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
.3. 集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
.4. 備份恢復角色:backup、restore;
.5. 全部數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
.6. 超級用戶角色:root
// 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
.2. 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
.3. 集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
.4. 備份恢復角色:backup、restore;
.5. 全部數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
.6. 超級用戶角色:root
// 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
.7. 內部角色:__system
具體角色:
Read:容許用戶讀取指定數據庫
readWrite:容許用戶讀寫指定數據庫
backup,retore:在進行備份、恢復時能夠單獨指定的角色,在db.createUser()方法中roles裏面的db必須寫成是admin庫,要否則會 報錯
dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile
userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限,
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。
userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限,
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。
root:只在admin數據庫中可用。超級帳號,超級權限
1.二、建立具體權限的用戶例子:
-
use admin
-
db.createUser({ user:'superadmin',pwd:'123456', roles:[{role:'root', db:'admin'}]}) ---建立超級管理員用戶
-
-
db.createUser({ user:'useradmin',pwd:'123456', roles:[{role:'userAdminAnyDatabase', db:'admin'}]}) ---建立用戶管理員帳戶(能查詢其餘庫集合,但不能查詢集合內容)
-
-
db.createUser({ user:'admin',pwd:'123456', roles:[{role:'readWriteAnyDatabase', db:'admin'}]}) ---建立訪問任意庫讀寫的帳戶
-
-
db.createUser({ user:'user1',pwd:'user1',roles:[{role:'readWrite',db:'test'}]}) ---建立只對test庫有讀寫權限的用戶
-
-
db.createUser({ user:"bkuser2",pwd:"Bkuser2",roles:[{role:"backup",db:"admin"}]}) ---建立用於備份時的用戶,如如果恢復權限,則將backup換爲restore便可
-
rs1:PRIMARY> db.createUser({ user:"bkuser2",pwd:"Bkuser2",
-
roles:[{role:"backup",db:"test"}]
-
})
-
-
Error: couldn't add user: No role named backup@test :
1.三、驗證新建用戶:
用戶在哪一個庫新建受權,則須要在哪一個庫進行auth驗證,注意一點,賬號是跟着庫走的,因此在指定庫裏受權,必須也在指定庫裏驗證(auth)。
-
>db ---查看當前所在庫
-
test
-
>db.createUser({user:'test1',pwd:'test1',roles:[{role:'readWrite',db:'test'},{role:'read',db:'Johnny'})})
-
> use Johnny
-
Johnny
-
>db.auth( 'test1','test1')
-
Error:Authentication failed.
-
0 ---表示auth驗證失敗
-
-
> use test
-
>db.auth( 'test1','test1')
-
1 ---表示驗證成功
1.四、查詢用戶:
查詢實例中全部的用戶信息
>use admin
>db.system.users.find().pretty() ---將全部用戶信息查詢出來
顯示某一庫下的全部用戶
>use test
>show users ---顯示在此庫受權的用戶信息
查詢指定用戶的相關信息:
-
rs1:PRIMARY>db
-
Johnny
-
rs1:PRIMARY> db.getUser("jianlong") ---須要在用戶所在庫才能執行此命令並得到信息,查詢到的信息和「show user」同樣,只是能夠指定用戶罷了
-
{
-
"_id" : "Johnny.jianlong",
-
"user" : "jianlong",
-
"db" : "Johnny",
-
"roles" : [
-
{
-
"role" : "readWrite",
-
"db" : "test"
-
},
-
{
-
"role" : "readWrite",
-
"db" : "Johnny"
-
}
-
]
-
}
-
rs1:PRIMARY> use tt
-
switched to db tt
-
rs1:PRIMARY> db.getUser( "jianlong") ---在帳戶非受權庫進行用戶信息查詢則會提示NULL
-
null
-
db.updateUser(username,update,writeConcern)
username部分是必需要有的,添加須要更新的username
update部分裏內容是可選,但必須有其中一項,例customData、roles、pwd
writeConcern部分是可選項
語法結構:
-
db.updateUser(
-
"<username>",
-
{
-
customData : { <any information> },
-
roles : [
-
{ role: "<role>", db: "<database>" } | "<role>",
-
...
-
],
-
pwd: "<cleartext password>"
-
},
-
writeConcern: { <write concern> })
能夠經過此命令修改用戶的權限,但使用此命令修改權限時,則會覆蓋原先的全部權限
例:
rs1:PRIMARY> db.updateUser("root",
{ roles:[{role:"readWriteAnyDatabase",
db:"admin"}]
})
{ roles:[{role:"readWriteAnyDatabase",
db:"admin"}]
})
在原來權限上新增權限:
-
rs1:PRIMARY> use Johnny
-
switched to db Johnny
-
rs1:PRIMARY> db.grantRolesToUser( "jianlong",[{role:'readWrite',db:'test'}]) ---不會覆蓋原權限信息,只新增權限
-
rs1:PRIMARY> show users;
-
{
-
"_id" : "Johnny.jianlong",
-
"user" : "jianlong",
-
"db" : "Johnny",
-
"roles" : [
-
{
-
"role" : "readWrite",
-
"db" : "test"
-
},
-
{
-
"role" : "readWrite",
-
"db" : "Johnny"
-
}
-
]
-
}
-
rs1:PRIMARY> use tt
-
rs1:PRIMARY> db.grantRolesToUser( "jianlong",[{role:'read',db:'tt'}])
-
2016-11-09T15:59:20.154+0800 E QUERY [thread1] Error: Could not find user jianlong@tt
-
---不能在用戶非受權庫進行用戶的權限添加,不然會報錯,即表現出帳戶跟着庫走的特色
2.二、修改用戶密碼:
使用db.changeUserPassword(「username","newPasswd")
rs1:PRIMARY> use tt
switched to db tt
rs1:PRIMARY> db.changeUserPassword("tuser","
123456") ---注意要在帳戶所在受權庫執行此命令
三、刪除用戶
>db.dropUser("test1")
四、用戶自定義角色Role
語法格式:
-
>db.createRole(
-
{
-
role: "<name>", ---role名字
-
privileges: [
-
{ resource: { <resource> }, actions: [ "<action>", ... ] }, ---配置具體對象的權限,好比對某集合的find,insert等權限
-
...
-
],
-
roles: [
-
{ role: "<role>", db: "<database>" } | "<role>", ---繼承其餘角色權限,能夠數組爲空
-
...
-
]
-
}
-
)
官方網站上有這樣一句話須要注意:
Except for roles created in the
admin
database, a role can only include privileges that apply to its database and can only inherit from other roles in its database.
也就是說除了admin庫裏的role之外,自定義角色擁有的權限只能應用到本庫而且也只能從本庫的角色進行權限繼承(若是理解有誤還望指點)
可是我試驗了一下:雖然配置角色權限時不能映射其餘庫的對象權限,可是角色能夠跨庫受權給用戶(若是你不明白這句話,不要緊,咱直接上實驗)
舉例:
若是想在此角色上添加其餘庫中集合的查詢權限則會報錯:
-
db.createRole({
-
role:"SenderHis_Read",
-
privileges:[
-
{resource:{db:"APP_MSG_GW",collection:"SenderHis"},actions:["find"]}
-
],
-
roles:[
-
{role:"read",db:"admin"} ---繼承的角色能夠爲空數組[]
-
]
-
})
若是想在此角色上添加其餘庫中集合的查詢權限則會報錯:

若在APP_SUPERPROXY庫上另建一角色
-
db.createRole({
-
role:"MONITOR_Read",
-
privileges:[
-
{resource:{db:"APP_SUPERPROXY",collection:"MONITOR"},actions:["find"]}
-
],
-
roles:[]
-
})
此時能夠將兩個角色同時受權給APP_MSG_GW庫下的一個用戶,使其擁有兩個庫中某些集合的查詢權限
-
>db
-
APP_MSG_GW
-
> show users;
-
{
-
"_id" : "APP_MSG_GW.zbx_Moniter",
-
"user" : "zbx_Moniter",
-
"db" : "APP_MSG_GW",
-
"customData" : {
-
"desc" : "zabbix monitor account"
-
},
-
"roles" : [
-
{
-
"role" : "MONITOR_Read",
-
"db" : "APP_SUPERPROXY"
-
},
-
{
-
"role" : "SenderHis_Read",
-
"db" : "APP_MSG_GW"
-
}
-
]
-
}
查看角色的具體privilege(權限):
>db.getRole("SenderHis_Read",{showPrivileges:true})
另外一參數:showBuiltinRoles
五、建立執行eval()命令的權限
說明:
好比你想在Python腳本中調用寫好的mongo存儲函數(存於system.js系統表中),若是你只是擁有普通權限,那麼執行的時候就會報錯以下:

就算是你用root帳號去鏈接mongo來執行命令也沒用
解決辦法:
建立一個角色,擁有anyResource的anyAction的權限
以後賦角色給用戶便可

安全性:
若是必需要外部調用eval,不然請慎重建立此角色且賦給用戶
anyAction
Allows any action on a resource.
Do not assign this action unless it is absolutely necessary.
anyResource
The internal resource
anyResource
gives access to every resource in the system and is intended for internal use. Do not use this resource, other than in exceptional circumstances. The syntax for this resource is {anyResource: true }
.