整理MongoDB文档:身份验证
整理MongoDB文档:身份验证
个人博客,求关注。
文章概叙
本文主要讲MongoDB在单机状态下的账户配置。理解了MongoDB的语法,对于如何配置用户权限会知道怎么配置,但是请注意给谁配置什么权限才是最重要的。
最小权限原则
系统的每个程序或者用户应该使用完成工作所需的最小权限工作
在MongoDB中,最小权限原则指的用户的访问、操作权限应限制为仅执行日常授权活动绝对需要的那些资源。
如一个标准的开发者,你应该给予的是开发环境下的特定库的读写权限,甚至必要情况下给予admin的权限,以免影响到开发的进度。
但对一个生产环境的数据库,应该只给予开发者查看数据的权限,最好不要给予修改数据甚至是admin的权限,不然人家删库跑路,或者遇到新手修改了数据库结构导致线上爆炸,我想你可能过不了一个好年了。。。
MongoDB用户角色
在 MongoDB 中,用户角色用于控制用户对数据库和集合的访问权限。
在MongoDB中,访问权限并不是针对整个系统的,而是针对数据库的。也就是说你给一个开发者分配了一个账号,并不是说这个开发者可以直接登陆我们的DB,并且访问所有的DB,而是给这个开发者a库以及b库的权限,然后他可以在指定的两个库中进行操作,但是无法到c库中进行为所欲为的操作。
除了从数据库的层面进行管控,还对权限方面进行区分以及管控,如前面所提的,开发者在生产环境下,应该只对数据库有查看的权限,不应该对其有修改的权限,也就是说查看以及修改两者是分开的。
接下来用一两个例子,通过对MongoDB的语法来了解角色权限这一块。
内置角色
https://www.mongodb.com/docs/manual/reference/built-in-roles/
MongoDB为我们创建了一堆的角色,被称为内置角色。而每一个内置角色的权限都不相同,当前的版本是依据7.x,上述已经将文章的原链接放上去了,强烈建议大家去查看。
下面先列出所有的角色类别。
数据库用户角色
数据库用户角色拥有read 以及readWriter权限。
read 提供读取所有非系统集合上的数据的能力。即除了config、local、admin的表。
readWriter 提供在read的能力上外加修改所有非系统集合的能力。
数据库管理角色
数据库管理角色拥有dbAdmin, dbOwner, userAdmin权限。
dbAdmin提供执行管理任务的能力,例如与架构相关的任务、索引和收集统计信息。此角色不授予用户和角色管理权限。
userAdmin提供在当前数据库,即可以在当前的数据库中修改人员的权限。
dbOwner数据库所有者可以对数据库执行任何管理操作。此角色结合了由readWrite, dbAdmin和userAdmin角色。
群集管理角色
集群管理角色拥有clusterAdmin, clusterManager, clusterMonitor, hostManager的权限。
clusterManager提供对群集的管理和监视操作,一个具有此角色的用户可以访问和数据库,这些数据库用于分片和复制。
clusterMonitor提供对监视工具的只读访问权限。
hostManager提供监视和管理服务器的功能。
clusterAdmin提供最大的群集管理访问权限。此角色结合了 授予的特权clusterManager, clusterMonitor和hostManager角色。此外,该角色还提供dropDatabase行动。
备份和还原角色
备份和还原角色拥有backup、restore。
backup提供备份数据所需的最小权限。
restore提供从备份还原数据的权限。
全数据库角色
全数据库角色拥有readAnyDatabase, readWriteAnyDatabase, userAdminAnyDatabase, dbAdminAnyDatabase的权限。
readAnyDatabase提供除了admin, config, local库之外的所有数据库的读取权限。
readWriteAnyDatabase在readAnyDatabase的基础上,外加提供除了admin, config, local库之外的所有数据库的编辑权限。
userAdminAnyDatabase提供除了admin, config, local库之外的所有数据库的用户管理操作访问权限。
dbAdminAnyDatabase提供除了admin, config, local库之外的所有数据库的管理员管理操作访问权限。
超级用户角色
超级用户角色拥有root 权限。
root为角色提供为任何用户分配任何权限的功能、任何数据库,这意味着具有这些角色之一的用户可以为自己分配对任何数据库的任何特权。
内部角色
内部角色拥有的是__system权限,一般不会使用到,也超级不建议分配出去。所以不做介绍。
创建用户
当了解了MongoDB的各个角色后,我们就进入到创建角色的篇章,基于前面所提及的最小权限原则,我们创建一个root账号作为后门,以及创建一个在test的只读账号还有在test的读写账号做测试,首先我们需要进入到admin库中。
use admin
db.createUser({user: 'root',pwd: 'root',roles: ['root']})
创建完了root权限后,再创建两个上述的用户。
db.createUser({user: "testRead",pwd: passwordPrompt(),roles: [{ role: "readWrite", db: "test" }]}
)
db.createUser({user: "testReadWrite",pwd: passwordPrompt(),roles: [{ role: "readWrite", db: "test" }]}
)

使用passwordPrompt()来代替原本的文字输入,毕竟这样子毕竟正经点。
列出用户
当前创建了三个用户,但是在继续操作之前,我们需要将其打印出来,以防止你在测试的时候有问题,但是自己不知道,在admin的库下,输入下方的指令。
db.system.users.find({},{ "user": 1, "roles": 1 })

此时可以看到,不小心将testRead的权限写错了,应该为read权限,所以后续我们要修改它,但是现在先记下来,不做任何改动。
启用访问控制
在MongoDB部署上启用访问控制会强制执行身份验证。启用访问控制后,用户需要标识自己的身份并且只能执行符合授予的权限的操作分配给其用户的角色。
启动访问控制的方式有两种。
一种在命令行中启,需要在命令行选项中增加 --auth:
mongod --auth --port 27017
第二种方式是使用配置文件启动MongoDB,在配置文件中增加security.authorization设置
security:authorization: enabled

由于本人喜欢用net start mongodb来启动单机服务,所以就直接使用第二种来启动账号验证了。

验证权限
现在我们重新启动,并且进入到服务中了,因此我们需要调用下面的方法来输入我们的账号密码,先拿个root账号试试
db.auth("root","root")

接着,我们想起了之前设置错误的账号–test库下面的testRead,此时,可以使用下面的语法进行更新(正常情况下,都是在admin账号下进行的操作,不会在未开启auth的时候进行修改,所以此时才进行修改,尽可能的模拟出开发环境
db.updateUse("testRead",{roles: [{ role: "read", db: "test" }]})

修改成功,接下来查看testRead账号是否只有权限查看test下的数据。当然了,修改密码,也是可以这么设置的,只是参数修改为password。

可以看到,当更改为了testRead账号之后,只能执行查看test库下的数据,无法进行任何的修改操作。
删除角色
对于角色的操作,有了增、改、查,那么就剩下删除的api了,而对于删除,我们需要使用到之前的root账号,并且在admin库下进行修改。
删除角色比较简单,需要注意的是在admin库中进行删除,并且需要有管理员权限。可以使用
db.system.users.remove({ "user": "testRead" })

至此,单机模式下的mongodb 账号验证就完成了,更多的是需要注意每一个role代表的是什么,如果无法满足角色要求,还有一个更加详细的自定义角色涉及到集合,但是很少用到,太细致的权限反而会加大开发成本,总不能每加一个集合,都要考虑分配给谁谁谁权限吧?
可视化工具中访问
mongodb://username:password@localhost:27017
mongodb://root:root@localhost:27017

相关文章:
整理MongoDB文档:身份验证
整理MongoDB文档:身份验证 个人博客,求关注。 文章概叙 本文主要讲MongoDB在单机状态下的账户配置。理解了MongoDB的语法,对于如何配置用户权限会知道怎么配置,但是请注意给谁配置什么权限才是最重要的。 最小权限原则 系统的每个程序或者…...
逐字稿 | 视频理解论文串讲(下)【论文精读】
1 为什么研究者这么想把这个双流网络替换掉,想用3D 卷积神经网络来做? 大家好,上次我们讲完了上半部分,就是 2D 网络和一些双流网络以及。它们的。变体。今天我们就来讲一下下半部分,就是 3D 网络和 video Transformer…...
【C++入门:C++世界的奇幻之旅】
1. 什么是C 2. C发展史 3. C的重要性 4. C关键字 5. 命名空间 6. C输入&输出 7. 缺省参数 8. 函数重载 9. 引用 10. 内联函数 11. auto关键字(C11) 12. 基于范围的for循环(C11) 13. 指针空值---nullptr(C11)05. 1. 什么是C C语言是结构化和模块化的语言&…...
rancher2.6.4配置管理k8s,docker安装
docker快速安装rancher并管理当前k8s集群。 1、拉镜像 docker pull rancher/rancher:v2.6.4 2、启动rancher 启动很慢 --privileged必须拥有root权限,并挂载卷 docker run --privileged -d --restartunless-stopped -p 80:80 -p 443:443 -v /usr/local/docker_vo…...
Python---练习:使用while嵌套循环打印 9 x 9乘法表
案例 使用while嵌套循环打印 9 x 9乘法表 思考 之前做过打印出三角形,那个三角形是5行的,这次打印9行的三角形。可以先使用while嵌套循环打印9行的直角三角形 相关链接Python---练习:打印直角三角形(利用wihle循环嵌套…...
仅手机大小!极空间T2随身数据魔盒发布:既是NAS 又是U盘
今天极空间召开新品发布会,带来了极空间T2随身数据魔盒,售价1999元起。 极空间T2随身数据魔盒体积仅手机大小,充电宝可供电。既是个NAS,又是个U盘。 其具备双M.2插槽,可安装两块固态硬盘。4G内存支持docker,…...
设计院图纸加密防泄密方案——天锐绿盾加密软件@德人合科技
天锐绿盾是一款专业的企业信息化防泄密软件,主要针对文档全生命周期进行加密保护,包括创建、修改、传输、归档、分发、销毁等全过程。它可以加强外发数据及终端离线的管理,对正常授权外带范围内的数据流程进行规范。设计图纸、文档等成果数据…...
AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (二)
AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…...
实用新型和发明的区别
实用新型专利:是指对产品的形状、构造或者其结合所提出的适于实用的新的技术方案,指对有具体产品结构提出的改进或创造。与发明相比,实用新型专利申请对于技术的要求更低一点,在审查的时候不会进行详细的检索和对比,授…...
Oracle通过透明网关查询SQL Server 报错ORA-00904
Oracle通过透明网关查询SQL Server 报错ORA-00904 问题描述: 只有全表扫描SELECT * 时SQL语句可以正常执行 添加WHERE条件或指定列名查询,查询语句就报错 问题原因: 字段大小写和SQLSERVER中定义的不一致导致查询异常 解决办法: 给…...
MySQL表操作—存储
建表: mysql> create table sch( -> id int primary key, -> name varchar(50) not null, -> glass varchar(50) not null -> ); Query OK, 0 rows affected (0.01 sec) 插入数据: mysql> insert into sch (id,name,…...
Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包
Gradle中,没有Assemble任务 1. 在编译aar包或者编译module的时候,没有release包,我们一般都是通过assemble进行编译。 如果在Gradle中找不到task。 可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task …...
重复性管理--从泛值到泛型以及泛函(中)--泛函是什么及为什么
在前面, 我们探讨了泛型范式在解决重复性问题上的应用, 在这里, 将继续探讨泛函范式在解决重复性问题上的作用. 注: 关于"泛函(functional)“这一名称, 前面说了, 泛型的本质是"参数化类型”, 那么, 按照这一思路, 泛函的意思也可以理解为"函数的参数化"或…...
Arm推出Total Design生态系统,优化基于Neoverse CSS的SoC开发流程
目录 构建生态系统 将Arm架构小芯片带给大众 关于Arm Total Design的结语 我们最近报道了Arm的Neoverse CSS Genesis N2平台的发布,这是一个近乎现成的计算子系统设计,旨在加快尖端基础设施中定制加速器的上市时间。我们当时评论说,我们可…...
30天精通Nodejs--目录与说明
说明 本系列博客主要针对nodejs零基础的小伙伴,涵盖了Node.js从基础到高级的各个方面。 前置条件,有js的基础,了解css和html。 nodejs版本20.8.1。 目录 基础知识 第1天:基础介绍 第2天:模块系统与npm 第3天&#…...
如何创建前端绘图和图表?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
Python基础入门例程3-NP3 读入字符串
描述 小白正在学习Python,从变量输出开始。请使用input函数读入一个字符串,然后将其输出。 输入描述: 输入一行字符串。 输出描述: 将读入的变量输出。 示例1 输入: Nowcoder 复制输出: Nowcoder…...
每日一练 | 网络工程师软考真题Day44
1、在IEEE 802.11标准中使用了扩频通信技术,下面选项中有关扩频通信技术说法正确的选项是 。 A.扩频技术是一种带宽很宽的红外通信技术 B.扩频技术就是用伪随机序列对代表数据的模拟信号进行调制 C.扩频通信系统的带宽随着数据…...
Python11-正则表达式
Python11-正则表达式 1.正则表达式简介2.正则表达式常见用法和符号3.正则查找4.re.Match对象与group5.re.compile6.正则表达式修饰符7.正则匹配规则8.正则表达式匹配练习9.正则替换10.贪婪模式和非贪婪模式 1.正则表达式简介 正则表达式(Regular Expression&#x…...
【机器学习】XGBoost
1.什么是XGBoost XGBoost(eXtreme Gradient Boosting)极度梯度提升树,属于集成学习中的boosting框架算法。对于提升树,简单说就是一个模型表现不好,继续按照原来模型表现不好的那部分训练第二个模型,依次类推。本质思想与GBDT一致…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
