MongoDB 入门教学贴 从术语到操作 (用户权限 内部培训贴)

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2330人左右 1 + 2 + 3 + 4 +5 +6 + 7),新建7群。

接着上期,本期咱们来看看MongoDB 的用户权限部分,在权限这部分我们需要先说明一个部分的问题,建立一个账号的归属权,这里MongoDB 也是有系统库的,这里的对于用户有不同的含义,比如在admin里面建立的数据库用户和在普通应用库中建立的用户是有不同的,在admin 库建立的用户是可以具有全局的管理员的权限的,而在用户数据库中建立的用户,可以拥有这个库的最大的权限。这是需要说明的,而这些账号,建立在每个数据库的system.user 的集合中。

> show databases;
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

作为入门教学贴,我们先来熟悉一下MongoDB 的role 角色的部分,在给一个用户建立的时候,都需要对这个用户至少赋予一个角色来匹配相关的用户需要执行的功能。 主要 role分为如下几大类 

1  数据库用户的角色 

read 

readWrite 

2  数据库管理员账号 

dbAdmin

dbOwner 

userAdmin 

3  集群或复制集合账号 

clusterAdmin 

clusterManager 

clusterMonitor 

enableSharding 

hostManager 

4  备份和恢复角色 

backup 

restore 

5  非单一数据库账号类角色

readAnyDatabase

readWriteAnyDatabase 

userAdminAnyDatabase root

下面以问题的方式来对账号的问题进行一个学习 1  非单一的数据库账号类的角色和普通的角色之间的不同是什么 这里我们以 readAnyDatabase 和 read 做一个比较, 从下面的图中我们可以看到,如果是普通的只读账号,可以在任意的数据库中建立,而如果是建立非针对某一个数据库,而是针对所有的数据库都可以读取的账号,则必须将账号建立在 admin库中,否则建立的时候会报错,没有相关的role。

> db.createUser({
...   user: "test",
...   pwd: "test",
...   roles: [
...     { role: "read", db: "test" }
...   ]
... })
Successfully added user: {
 "user" : "test",
 "roles" : [
  {
   "role" : "read",
   "db" : "test"
  }
 ]
}
> db.createUser({
...   user: "testany",
...   pwd: "testany",
...   roles: [
...     { role: "readAnyDatabase", db: "test" }
...   ]
... })
uncaught exception: Error: couldn't add user: Could not find role: readAnyDatabase@test :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1362:11
@(shell):1:1
> db.createUser({
...   user: "testany",
...   pwd: "testany",
...   roles: [
...     { role: "readAnyDatabase", db: "admin" }
...   ]
... })
Successfully added user: {
 "user" : "testany",
 "roles" : [
  {
   "role" : "readAnyDatabase",
   "db" : "admin"
  }
 ]
}
>

问题 2 ,一次可以给一个账号赋予多个角色和多个数据库的权限吗

> use admin
switched to db admin
> 
> db.grantRolesToUser(
...   "test",
...   [
...     { role: "readAnyDatabase", db: "admin" },
...     { role: "clusterMonitor", db: "admin" },
...     { role: "read", db: "test" }
...   ]
... )
uncaught exception: Error: Could not find user "test" for db "admin" :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.grantRolesToUser@src/mongo/shell/db.js:1589:15
@(shell):1:1
>

一次性给已有的账号,进行赋予多个权限是可以的,但前提是你赋予的账号应该在你要赋值的数据库中已经存在此账号,上面的错误明显的问题在于在admin 数据库中并没有test 的账号

> use test
switched to db test
> 
> db.grantRolesToUser(
...   "test",
...   [
...     { role: "readAnyDatabase", db: "admin" },
...     { role: "clusterMonitor", db: "admin" },
...     { role: "read", db: "test" }
...   ]
... )
> use test
switched to db test
> 
> db.grantRolesToUser(
...   "test",
...   [
...     { role: "readAnyDatabase", db: "admin" },
...     { role: "clusterMonitor", db: "admin" },
...     { role: "read", db: "test" },
... { role: "backup", db: "test" },
...   ]
... )
uncaught exception: Error: Could not find role: backup@test :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.grantRolesToUser@src/mongo/shell/db.js:1589:15
@(shell):1:1
> 



> db.grantRolesToUser(
...   "test",
...   [
...     { role: "readAnyDatabase", db: "admin" },
...     { role: "clusterMonitor", db: "admin" },
...     { role: "read", db: "test" },
... { role: "backup", db: "test" },
...   ]
... )
uncaught exception: Error: Could not find role: backup@test :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.grantRolesToUser@src/mongo/shell/db.js:1589:15
@(shell):1:1
> 
> 
> 
> 
> db.grantRolesToUser(
...   "test",
...   [
...     { role: "readAnyDatabase", db: "admin" },
...     { role: "clusterMonitor", db: "admin" },
...     { role: "read", db: "test" },
... {role: "backup", db: "admin"}
...   ]
... )
>

上图可以看到,对于添加用户的部分,需要注意

1 你所在用户的数据库可以赋予相关的role,如果没有则报错, 

2 一个Mongo实例里面,会存在同名的账号,但权限不同,寄生在不同的数据库内。参加下图。

> db.getUsers()
[
 {
  "_id" : "admin.test",
  "userId" : UUID("ebe01e6d-2102-4f2a-81a8-5d47c613e03c"),
  "user" : "test",
  "db" : "admin",
  "roles" : [
   {
    "role" : "readAnyDatabase",
    "db" : "admin"
   },
   {
    "role" : "read",
    "db" : "admin"
   },
   {
    "role" : "backup",
    "db" : "admin"
   },
   {
    "role" : "read",
    "db" : "test"
   },
   {
    "role" : "clusterMonitor",
    "db" : "admin"
   }
  ],
  "mechanisms" : [
   "SCRAM-SHA-1",
   "SCRAM-SHA-256"
  ]
 }
]
> use test
switched to db test
> db.getUsers()
[
 {
  "_id" : "test.test",
  "userId" : UUID("46a5ecc4-4c4b-44d7-9756-5b299a5c07be"),
  "user" : "test",
  "db" : "test",
  "roles" : [
   {
    "role" : "read",
    "db" : "test"
   },
   {
    "role" : "clusterMonitor",
    "db" : "admin"
   },
   {
    "role" : "readAnyDatabase",
    "db" : "admin"
   }
  ],
  "mechanisms" : [
   "SCRAM-SHA-1",
   "SCRAM-SHA-256"
  ]
 },
 {
  "_id" : "test.testany",
  "userId" : UUID("a52e5f1f-1be8-48a9-b12a-b733e781f9f5"),
  "user" : "testany",
  "db" : "test",
  "roles" : [
   {
    "role" : "readAnyDatabase",
    "db" : "admin"
   }
  ],
  "mechanisms" : [
   "SCRAM-SHA-1",
   "SCRAM-SHA-256"
  ]
 }
]
>

问题:那么如果区分使用不同数据库里面的同名的数据库账号,想看到同名但不同数据库里面的账号的权限。可以使用 use admin 对system.user进行查询获得相关所有同名的数据库的权限列表。

> use admin
switched to db admin
> db.system.users.find({user: "test"})
{ "_id" : "admin.test", "userId" : UUID("ebe01e6d-2102-4f2a-81a8-5d47c613e03c"),
 "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, 
 "salt" : "++dxfXK4V/Hrwj193xubAA==", "storedKey" : "73SwUZIkLUFTC91OFV+GiUe5HWk=", 
 "serverKey" : "b6boRgk6GVLXkS7FWphP9amUeVg=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, 
 "salt" : "2vUagKnwzCSqRJ+jKC5B8qHE2MKK9Dpl5ZQI3Q==", "storedKey" : "JQyA4MXtbGDMsacOuDsu4k9DAkrZBEU3SBkg+wu97Ew=", "serverKey" : "NnTry6cA/FaWOi76FuRC5sW3EezcgR8AlPaaBf4mP6U=" } }, "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" }, 
{ "role" : "read", "db" : "admin" }, 
{ "role" : "backup", "db" : "admin" }, 
{ "role" : "read", "db" : "test" }, 
{ "role" : "clusterMonitor", "db" : "admin" } ] }

{ "_id" : "test.test", "userId" : UUID("46a5ecc4-4c4b-44d7-9756-5b299a5c07be"),
 "user" : "test", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, 
 "salt" : "WNUwx9cnVQS1A8Ex1kQ/fw==", "storedKey" : "LFXejbapLi3MGOTxh8MFMVv8ULo=",
 "serverKey" : "pN7e2N2YA4czXo91Ru5dcFF40Mo=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, 
 "salt" : "GhgY6nNbNjUrYF7EAqGfab1DgYN0j+wCBGBQ0g==", "storedKey" : "TvWDEJ2FVbRO1ULy4qySKGFmXGFghm57Rx11Kg0y6C4=", 
 "serverKey" : "bM/h/jSl/QxYSRbPNkm0w3otYnjN21mlJ3KLnnS9xJs=" } }, "roles" : [ { "role" : "read", "db" : "test" },
 { "role" : "clusterMonitor", "db" : "admin" }, { "role" : "readAnyDatabase", "db" : "admin" } ] }

问题:回收部分用户的权限

回收权限时,需要先弄清楚眼红红有哪些权限,用下面的命令来获得你要回收的用户的权限列表

> db.system.users.find({user: "test"},{roles:1})
{ "_id" : "admin.test", "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" }, { "role" : "read", "db" : "admin" }, { "role" : "backup", "db" : "admin" }, { "role" : "read", "db" : "test" }, { "role" : "clusterMonitor", "db" : "admin" } ] }
{ "_id" : "test.test", "roles" : [ { "role" : "read", "db" : "test" }, { "role" : "clusterMonitor", "db" : "admin" }, { "role" : "readAnyDatabase", "db" : "admin" } ] }
>

然后通过revokeRolesFromUser 来回收用户的权限,在用户所在的数据库中进行相关的操作。

> db.revokeRolesFromUser("test",["read","backup"])
> db.system.users.find({user: "test"},{roles:1})
{ "_id" : "admin.test", "roles" : [ { "role" : "read", "db" : "test" }, { "role" : "clusterMonitor", "db" : "admin" } ] }
{ "_id" : "test.test", "roles" : [ { "role" : "clusterMonitor", "db" : "admin" }, { "role" : "readAnyDatabase", "db" : "admin" } ] }
>

问题:怎么获得所有的数据库中的用户和相关的权限列表

> db.system.users.find({},{"user":1,"db":1,"roles":1}).pretty()
{
 "_id" : "test.test",
 "user" : "test",
 "db" : "test",
 "roles" : [
  {
   "role" : "clusterMonitor",
   "db" : "admin"
  },
  {
   "role" : "readAnyDatabase",
   "db" : "admin"
  }
 ]
}
{
 "_id" : "test.testany",
 "user" : "testany",
 "db" : "test",
 "roles" : [
  {
   "role" : "readAnyDatabase",
   "db" : "admin"
  }
 ]
}
{
 "_id" : "admin.test",
 "user" : "test",
 "db" : "admin",
 "roles" : [
  {
   "role" : "read",
   "db" : "test"
  },
  {
   "role" : "clusterMonitor",
   "db" : "admin"
  }
 ]
}
>

问题:怎么获得所有的数据库中的用户和相关的权限列表 问题:统计当前用户中,具有clusterMonitor权限的用户

> db.system.users.find({"roles.role":"clusterMonitor"}).count()
2

对于用户的信息的统计,可以通过system.users来进行

问题: mongodb 中的root 和  userAdminAnyDatabase 权限是一个意思吗?

不是,ROOT 相当与一个全能者,从权限到数据的操作都可以进行,userAdminAnyDatabase 相当与一个管理权限者,但他不能直接操作数据,他可以给其他用户来赋予权限操作数据,除非他被显式赋予了相应的数据操作权限。。

置顶文章:

MySQL 让你还用5.7 出事了吧,用着用着5.7崩了

PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆

云原生数据库是一场闹剧,还是数据库市场的程咬金

PolarDB 从节点Down机后,引起的主从节点强一致的争论

临时工说:数据库和周边做不好原因是产品经理的锅?读从OtterTune的倒下说起-有感

往期热门文章:

临时工说:  网友问35岁就淘汰,我刚入行DBA 怎么办?

临时工访谈:问金融软件开发总监  哪些业务不用传统数据库

PostgreSQL  15 16 小版本更新信息小结 版本更新是不是挤牙膏

临时工访谈:临时工 写了6年多公众号赚了多少钱?

MongoDB 的一张“大字报”  服务客户,欢迎DISS

MongoDB  聚合怎么写,更复杂的聚合案例

MySQL 8.0 小版本更新要点,那个小版本更稳定(8.0.24-8.0.37)

SQL SERVER 2022 针对缓存扫描和Query Store 的进步,可以考虑进行版本升级

有思想的人,在这个年代会很痛苦?躺平还是醒着都无所谓了

MYSQL 版本迁移带来 严重生产事故“的”分析

PolarDB  Serverless POC测试中有没有坑与发现的疑问

临时工访谈:PolarDB  Serverless  发现“大”问题了  之 灭妖记 续集

临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一

PolarDB for PostgreSQL  有意思吗?有意思呀

PolarDB  Serverless POC测试中有没有坑与发现的疑问

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:从国产数据库 到 普罗大众的产品 !与在美国创业软件公司老板对话

PostgreSQL 如何通过工具来分析PG 内存泄露

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:我很普通,但我也有生存的权利,大龄程序员 求职贴

临时工说: 快速识别 “海洋贝壳类” 数据库方法速递

临时工说:国产 数据库 销售人员  图鉴

临时工说:DBA 是不是阻碍国产数据库发展的毒瘤 ,是不是?从国产DB老专家的一条留言开始 (其实更好看的是文章下方的留言)

感谢 老虎刘 刘老师 对 5月20日 SQL 问题纠正贴 ---PostgreSQL 同一种SQL为什么这样写会提升45%性能

PostgreSQL 同一种SQL为什么这样写会提升45%性能 --程序员和DBA思维方式不同决定

MongoDB 不是软柿子,想替换就替换

PostgreSQL  熊灿灿一句话够学半个月 之 KILL -9

MongoDB  挑战传统数据库聚合查询,干不死他们的

临时工说:国内数据库企业存活   “三板斧”

临时工说:搞数据库 光凭的是技术,那DBA的死多少次?

PostgreSQL  分组查询可以不进行全表扫描吗?速度提高上千倍?

临时工说:分析当前经济形势下 DBA 被裁员的根因

PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理

MySQL 八怪(高老师)现场解决问题实录

PostgreSQL 为什么也不建议 RR隔离级别,MySQL别笑

临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者

临时工说:OceanBase 到访,果然数据库的世界很卷,没边

临时工访谈:恶意裁员后,一个国产数据库企业程序员的心声

临时工说:上云后给 我一个 不裁 DBA的理由

PolarDB for PostgreSQL  有意思吗?有意思呀

PostgreSQL   玩PG我们是认真的,vacuum 稳定性平台我们有了

临时工说:裁员裁到 DBA 咋办  临时工教你 套路1 2 3

PolarDB  搞那么多复杂磁盘计费的东西,抽筋了吗?

临时工说:OceanBase 到访,果然数据库的世界很卷,没边

MONGODB  ---- Austindatabases  历年文章合集

MYSQL  --Austindatabases 历年文章合集

POSTGRESQL --Austindatabaes 历年文章整理

POLARDB  -- Ausitndatabases 历年的文章集合

PostgreSQL  查询语句开发写不好是必然,不是PG的锅

SQL SERVER 如何实现UNDO REDO  和PostgreSQL 有近亲关系吗

MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)

MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模

MongoDB  双机热备那篇文章是  “毒”

MongoDB   会丢数据吗?在次补刀MongoDB  双机热备

临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处

POLARDB  到底打倒了谁  PPT 分享 (文字版)

PostgreSQL  字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"

PostgreSQL  Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlServer,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。

截止今天已发布1180篇文章

31aabf4472c7e563fb17290ebf26f788.png


6a1f2d350b62a198475e0b5d237870c3.png

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值