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 ...
随机推荐
- od中低位地址和高位的顺序,以及数据的存放读写
在观察内存的时候应当注意"内存数据"与"数值数据"的区别. 在我们的调试环境中,内存由低到高分布,你可以简单地把这种情形理解成Win32系统在内存中由地位向高位 ...
- Python函数中的位置参数
函数的参数在调用时传递数据时,默认是按参数的位置顺序传值,即形参的顺序与实参的顺序逐一对应,这种参数的使用模式称为位置参数.位置参数是最常用的一种参数使用形式. 使用位置参数传递实参的情况下,要求有缺 ...
- 第15.23节 PyQt(Python+Qt)入门学习:Model/View架构中QListView视图配套Model的开发使用
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 QListView理论上可以和所有QAbstractItemModel派生的类如QStri ...
- PyQt(Python+Qt)学习随笔:Qt Designer中窗口对象的windowFilePath属性
windowFilePath属性仅对窗口对象有效,用于关联一个窗口和对应的文件及路径. 当窗口没有设置标题属性的情况下,则窗口标题展示展示windowFilePath对应的文件名的信息(路径信息不展示 ...
- [BJDCTF2020]ZJCTF,不过如此 php伪协议, preg_replace() 函数/e模式
转自https://www.cnblogs.com/gaonuoqi/p/12499623.html 题目给了源码 <?php error_reporting(0); $text = $_GET ...
- THE BUG 队第一次团队作业
1.队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,311800512 ...
- bootstrap 扩展参数
后台接受的参数形式 前端加载bootstrap时做的处理
- Acwing 734. 能量石
贪心(微扰) + dp 这道题还是比较难的,前置知识: 贪心的微扰(邻项交换)证法,例题:国王游戏,耍杂技的牛 01背包 算法1:暴力\(O(T * n! * n)\) 可以\(dfs\)全排列枚举所 ...
- CF1416D Graph and Queries
本题解用于作者加深算法印象,也欢迎各位的阅读. 题目大意 给你一张无向图,并给你两种操作: \(1~v\) :找到当前点 \(v\) 所在的联通块内权值最大的点,输出该点权值并将其权值改为 \(0\) ...
- postgresql修改postgres用户密码
[postgres@pg01 ~]$ psql -Upostgres -dpostgres postgres=# alter user postgres with password 'postgres ...