MongoDB用户权限操作语法及示例
1、创建用户
1.1、语法格式:
1.1.1、格式及例子
>db.createUser(
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" '
} | "<role>",
...
]
}
)
例子:
>use admin
>db.createUser(
{
user:'user',
pwd :'123',
customData:{"desc":"This user is for administrators"},
roles:[
{
role:'userAdminAnyDatabase',db:'admin'
}
]
}
)
1.1.1、结构详解:
user :用户名 --必须项
pwd :密码 --必须项
customData :用于描述账户信息 --非必须项
roles :指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。--必须项(可以为空集合)
role里的角色可以选:
1.1.1.1、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
1.1.1.2、具体角色:
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、创建具体权限的用户例子:
1.2.1、创建超级管理员用户
use admin
db.createUser({user:'root',pwd:'123', roles:[{role:'root', db:'admin'}]}) 1.2.2、创建用户管理员账户(能查询其他库集合,但不能查询集合内容
use admin
db.createUser({user:'userAdmin',pwd:'123', roles:[{role:'userAdminAnyDatabase', db:'admin'}]}) 1.2.3、创建访问任意库读写的账户
use admin
db.createUser({user:'rwUser',pwd:'123', roles:[{role:'readWriteAnyDatabase', db:'admin'}]}) 1.2.4、创建只对test库有读写权限的用户
use test
db.createUser({user:'testUser',pwd:'123',roles:[{role:'readWrite',db:'test'}]}) 1.2.5、创建用于备份时的用户,如若是恢复权限,则将backup换为restore即可
use admin
db.createUser({user:"bkUser",pwd:"123",roles:[{role:"backup",db:"admin"}]})
注:新建backup账户时,roles里面的db必须是admin,要不然会报错,如下:
>db.createUser({user:"bkUser2",pwd:"123",roles:[{role:"backup",db:"test"}]})
Error: couldn't add user: No role named backup@test 1.3、验证新建用户:
用户在哪个库新建授权,则需要在哪个库进行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、查询用户:
1.4.1、查询实例中所有的用户信息
>use admin
>db.system.users.find().pretty() ---将所有用户信息查询出来 1.4.2、显示某一库下的所有用户
>use test
>show users ---显示在此库授权的用户信息 1.4.3、查询指定用户的相关信息:
>db
Johnny
>db.getUser("jianlong") ---需要在用户所在库才能执行此命令并获得信息,查询到的信息和“show user”一样,只是可以指定用户罢了
{
"_id" : "Johnny.jianlong",
"user" : "jianlong",
"db" : "Johnny",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
},
{
"role" : "readWrite",
"db" : "Johnny"
}
]
}
> use tt
switched to db tt
> db.getUser("jianlong") ---在账户非授权库进行用户信息查询则会提示NULL
null
#2、修改用户
2.1、语法格式
db.updateUser(
"<username>",
{
customData : { <any information> },
roles : [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
pwd: "<cleartext password>"
},
writeConcern: { <write concern> }
)
2.2、结构详解
username:要修改的用户的用户名 --必须项
update部分: ----必须项(至少其中一项)
customData:描述性信息
roles:修改的角色们
role:角色名
db :数据库
pwd:用户对应的密码
writeConcern:用来指定mongod对写操作的回执行为
2.3、例子
2.3.1、修改用户权限,但会覆盖原先的所有权限
例:
> db.updateUser("root",
{
roles:[
{ role:"readWriteAnyDatabase",
db:"admin"
}
]
}
) 2.3.2、修改用户权限,不会覆盖原权限信息,只新增权限:
> use Johnny
switched to db Johnny
> db.grantRolesToUser(
"jianlong",
[
{
role:'readWrite',
db:'test'
}
]
) ---
> show users;
{
"_id" : "Johnny.jianlong",
"user" : "jianlong",
"db" : "Johnny",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
},
{
"role" : "readWrite",
"db" : "Johnny"
}
]
}
>use tt
> db.grantRolesToUser(
"jianlong",
[
{
role:'read',
db:'tt'
}
]
)
Error: Could not find user jianlong@tt
---不能在用户非授权库进行用户的权限添加,否则会报错,即表现出账户随库走的特点 2.3.3、修改用户密码:
db.changeUserPassword(“username","newPasswd")
例子:
> use tt
switched to db tt
> db.changeUserPassword("tuser","123456")
---注意要在账户所在授权库执行此命令
#3、删除用户
>db.dropUser("test1")
#4、用户自定义角色Role
4.1、语法格式:
>db.createRole(
{
role: "<name>",
privileges: [
{ resource: { <resource> }, actions: [ "<action>", ... ] },
...
],
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]
}
)
4.2、结构解析:
role:自定义的角色名称 --必须项
privileges:配置具体对象的权限 ----必须项
resource:角色拥有的资源(collection)
action:对某集合的find,insert等权限
roles:继承其他角色权限
role:要继承的角色名称
db:数据库
官方网站上的一句话:
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以外,自定义角色拥有的权限只能应用到本库并且也只能从本库的角色进行权限继承(如果理解有误还望指点)
测试结果:虽然配置角色权限时不能映射其他库的对象权限,但是角色可以跨库授权给用户(如果你不明白这句话,没关系,咱直接上实验) 4.3、例子:
4.3.1、创建角色
db.createRole(
{
role:"SenderHis_Read",
privileges:[
{
resource:{
db:"APP_MSG_GW",
collection:"SenderHis"
},
actions:["find"]
}
],
roles:[
{
role:"read",
db:"admin"
}
]
}
)
4.3.2、如果想在此角色上添加其他库中集合的查询权限则会报错:
> db.grantPrivilegesToRole(
"SenderHis_Read",
[
{
resource:{
db:"APP_SUPERPROXY",
collection:"SenderHis"
},
actions:["find"]
}
]
)
{
"Message":"Roles on the ‘APP_MSG_GW‘ database cannot be granted privileges that target other databases or the cluster"
}
4.3.3、"官方网站上的一句话"验证测试
4.3.3.1、在APP_SUPERPROXY库上另建一角色
db.createRole(
{
role:"MONITOR_Read",
privileges:[
{
resource:{
db:"APP_SUPERPROXY",
collection:"MONITOR"
},
actions:["find"]
}
],
roles:[]
}
)
4.3.3.2、此时可以将两个角色同时授权给APP_MSG_GW库下的一个用户,使其拥有两个库中某些集合的查询权限
>use 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"
}
]
}
4.3.3.3、查看角色的具体privilege(权限):
>db.getRole("SenderHis_Read",{showPrivileges:true})
另一参数:showBuiltinRoles
#5、创建执行eval()命令的权限
5.1、官网地址:https://docs.mongodb.com/manual/reference/command/eval/#access-control
5.2、说明:
比如你想在Python脚本中调用写好的mongo存储函数(存于system.js系统表中),如果你只是拥有普通权限
,那么执行的时候就会报错,就算是你用root账号去连接mongo来执行命令也没用
5.3、解决办法:
5.3.1、创建一个角色,拥有anyResource的anyAction的权限,之后赋角色给用户即可:
db.createRole(
{
role:"excute_eval_system",
privileges:[
{
resource:{
anyResource:true
},
actions:["anyAction"]
}
]
}
)
5.3.2、术语解析:
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 }.
5.3.3、注意事项:
除非必须要外部调用eval,否则请慎重创建此角色且赋给用户
MongoDB用户权限操作语法及示例的更多相关文章
- T-Sql(七)用户权限操作(grant)
一般数据库的权限操作我们很少用,除非一些大型的项目,需要给数据库配置不同的用户及权限,防患于未然,今天我们就来了解下t-sql中配置用户权限操作. 先看示例代码: --创建登录名 create log ...
- MongoDB用户权限管理配置
MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...
- mysql用户权限操作
mysql用户权限操作1.创建用户mysql -urootcreate database zabbix default charset utf8;grant all on zabbix.* to za ...
- MongoDB用户权限认证
关于用户的认证及权限 用户是跟着库创建的,在哪个库创建的什么权限的什么用户,只对此库有相应权限(除超级管理员以外). 官网文档:https://docs.mongodb.com/master/refe ...
- [MongoDB] 用户权限管理
在新环境按照原来的步骤新装了MongoDB,结果出现了一些错误,才发现版本升到了2.6.1,用户权限相关的内容全部改掉了. 现在使用Role来管理用户,有一些内置的Role,也可以自定义Role. 内 ...
- mongodb用户权限管理(二)
数据库 分配用户权限 有了创建语法,和参数说明,接下来开始实践. 注意,还有一点,账号是跟着数据库绑定的,在那个库里授权,就在那个库里验证(auth) 否则会失败 创建 账号管理授权权限 的账号 &g ...
- mongodb的权限操作
一.开启权限认证 1.windows下的mongodb开启权限认证 C:\Users\Administrator>sc delete MongoDB //原来创建的服务如果没有开启 则删除 [S ...
- django用户权限操作
第一步:创建数据库和超级管理员,为了比较方便使用(里面有些的是没用的),额外新增 chioces , per_method , argument_list # 用户权限# 建立一个权限表,将映射关系存 ...
- mysqli用户权限操作
此操作指令在 mysql 的数据库中 所以要 use mysql 查询mysqli中所有用户的权限 select host,user form user; 添加用户 grant all privil ...
随机推荐
- MockWebServer使用指南(转载)
转载自(http://blog.csdn.net/shensky711/article/details/52771797 ) MockWebServer介绍 MockWebServer是square出 ...
- python数据更新
def cal(s,m): if s==u"废弃" or s==u"拆除": return 4 elif s==u"竣工": return ...
- 一条 SQL 语句在 MySQL 中如何执行的
一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的sizeType属性
在Designer的spacers部件中有2个部件,分别是Horizontal Spacer和Vertical Spacer,这两个部件都有sizeType属性,如图: 这个sizeType实际上与Q ...
- Oracle命令管理账户和权限
方式一.登陆数据库SQL PLUS: 步骤:Oracle - OraDb10g_home1 =>应用程序开发=>SQL PLUS 用户名:system 密码:tiger/admin 退出数 ...
- Python追加文件内容
测试中需要造几百个账号,写了个脚本可以自动生成账号,但想把生成的账号写入一个文件, 开始用的如下的write()方法,发下会先把原文件的内容清空再写入新的东西,文件里面每次都是最新生成的一个账号 mo ...
- linux 的bash 和 反斜杠
export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12 export GLUE_DIR=/path/to/glue python run_ ...
- NOI 2020 D1T3 本人题解
我看了出题人本题的做法,感觉很难写,就自己胡了一个\(O((n + m) \sqrt n)\)的做法. 第一步我的想法与出题人一样,都是考虑容斥降维.对第\(i\)组询问,我们枚举两个事件中较大的一个 ...
- redis学习之——在分布式数据库中CAP原理CAP+BASE
分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建立在网络之上的软件系统.正是因为软件的特性,所以分 ...
- Scala中的IO操作及ArrayBuffer线程安全问题
通过Scala对文件进行读写操作在实际业务中应用也比较多,这里介绍几种常用的方式,直接上代码: 1. 从文件中读取内容 object Main { def loadData(): Array[Stri ...