1、创建用户:


1.1 语法格式:

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'}]
 })


user:用户名

pwd:密码

customData: 用于描述账户信息

roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。

role里的角色可以选:

-In


 .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数据库中可用。超级账号,超级权限




1.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即可

注:新建backup账户时,roles里面的db必须是admin,要不然会报错,如下:


rs1:PRIMARY> db.createUser({user:"bkuser2",pwd:"Bkuser2",
                            roles:[{role:"backup",db:"test"}]
                           })

Error: couldn't add user: No role named backup@test :


1.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登录时也要先连接认证库



1.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


2、修改用户


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.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



123456")          ---注意要在账户所在授权库执行此命令



3、删除用户


>db.dropUser("test1")








4、用户自定义角色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"}          ---继承的角色可以为空数组[]
        ]
})



如果想在此角色上添加其他库中集合的查询权限则会报错:






     

prometheus mongodb 常用指标 mongodb roles_用户信息


若在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

5、创建执行eval()命令的权限



官网地址: https://docs.mongodb.com/manual/reference/command/eval/#access-control


说明:


     比如你想在Python脚本中调用写好的mongo存储函数(存于system.js系统表中),如果你只是拥有普通权限,那么执行的时候就会报错如下:

    

prometheus mongodb 常用指标 mongodb roles_数组_02



就算是你用root账号去连接mongo来执行命令也没用


解决办法:


     创建一个角色,拥有anyResource的anyAction的权限


之后赋角色给用户即可

     

prometheus mongodb 常用指标 mongodb roles_用户信息_03



安全性:


如果必须要外部调用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 } .