一、创建用户
1、语法格式
>db.createUser(
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]}
)
参数解释:
user:用户名
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)
.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权限。
root:只在admin数据库中可用。超级账号,超级权限
2、举例说明:
>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即可
> db.createUser({user:'useradmin',pwd:'123456',customData:{"desc":"This user is for administrators"},roles:[{role:'userAdminAnyDatabase',db:'admin'}]
3、验证新建用户
用户在哪个库新建授权,则需要在哪个库进行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 ---表示验证成功
所以说明一点,用户在哪个库创建,就要在哪个库auth认证,并在mongo登录时也要先连接认证库
4、查询用户
查询实例中所有的用户信息
>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
二、修改用户
1、语法格式
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> })
2、举例说明
2.1、修改用户权限
可以通过此命令修改用户的权限,但使用此命令修改权限时,则会覆盖原先的所有权限。例:
rs1:PRIMARY> db.updateUser("root",
{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.2、修改用户密码
使用db.changeUserPassword(“username","newPasswd")
rs1:PRIMARY> use tt
switched to db tt
rs1:PRIMARY> db.changeUserPassword("tuser","123456") ---注意要在账户所在授权库执行此命令
2.3、删除用户
>db.dropUser("test1")