一、建立用户:
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 }
.