整理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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/169546.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔部署nginx遇到的400错误和502错误

在部署express项目的过程中,由于我的代码有些变化,于是在宝塔面板上我又重新上传了一下我的项目,结果阴差阳错的被nginx反向代理配置不当引起的400错误request header or cokkie is too large和自己代码逻辑问题引起的502 bad gataway给绊倒了…

Springcloud介绍

1.基本介绍 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring …

springmvc视图格式——模板引擎freemarker输出HTML文本

目录 1. freemarker 介绍创建测试工程2.2.2) 配置文件2.2.3) 创建模型类2.2.4) 创建模板2.2.5) 创建controller2.2.6) 创建启动类2.2.7) 测试 2.3) freemarker基础2.3.1) 基础语法种类2.3.2) 集合指令(List和Map)2.3.3) if指令2.3.4) 运算符2.3.5) 空值处…

2023了,是时候使用pnpm了!

2023了,是时候使用pnpm了! Excerpt 2023了,是时候使用pnpm了! 什么是pnpm pnpm代表performant npm(高性能的npm),同npm和Yarn,都属于Javascript包管理安装工具,它较npm和…

Arcgis 数据操作

在进行数据操作的时候,需要注意坐标系要一致,这是前提。 数据类型 文件地理数据库:gbd 个人地理数据库:mdb (Mircosoft Access) 矢量数据:shp 推荐使用gbd数据,效率会更高。 采…

“第六届世界声博会暨2023科大讯飞全球1024开发者节”开幕式回顾及舆情问题

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 2023年10月24日,笔者全程参加了在安徽合肥奥体中心举办的“第六届世界声博会暨2023科大讯飞全球1024开发者节”开幕式主论坛,下面来回顾一下。 一、会议简介 会议主题:“…

javaEE -8(9000字详解网络编程)

一:网络编程基础 1.1 网络资源 所谓的网络资源,其实就是在网络中可以获取的各种数据资源,而所有的网络资源,都是通过网络编程来进行数据传输的。 用户在浏览器中,打开在线视频网站,如优酷看视频&#xff…

Django学习笔记——文件上传(界面还怪好看得嘞)

定义文件上传函数 #文件上页面 def uploadFileIndex(request):return render(request, "uploadFile.html")#文件上传接口 def uploadFile(request):if request.method POST and request.FILES[file]:uploaded_file request.FILES[file]fs FileSystemStorage()# 选…

前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(二)

阳光总在风雨后,请相信有彩虹。 案例 - 图书管理 bootstrap弹框 需求,点击添加按钮,没有离开当前页面,在当前页面弹出弹框(弹窗) 先学着实现一个简单的弹框,如下图右下角 bootstrap有两种方式…

螺旋矩阵[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2&#xf…

Java在非spring项目中读取 .properties后缀的自定义配置文件生成map,用于jar包开发读取内部或者外部配置文件

文章目录 代码演示效果参考文档 代码 package com.test.ljj;import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.PropertyResourceBundle; import java.util.Set;public c…

Java反射获取内部类方法

Java反射获取内部类方法 结论一、案例准备二、测试方法:使用反射获取类的成员内部类和方法具体操作具体操作(使用getDeclaredClasses) 结论 Java 通过反射可以获得内部类,包括内部类属性信息和方法。 一、案例准备 创建了一个类…

vue3 elementPlus 表格实现行列拖拽及列检索功能

1、安装vuedraggable npm i -S vuedraggablenext 2、完整代码 <template> <div classcontainer><div class"dragbox"><el-table row-key"id" :data"tableData" :border"true"><el-table-columnv-for"…

迅为RK3568开发板RTMP推流之视频监控

1 搭建 RTMP 媒流体服务器 nginx-rtmp 是一个基于 nginx 的 RTMP 服务模块&#xff0c;是一个功能强大的流媒体服务器模块&#xff0c; 它提供了丰富的功能和灵活的配置选项&#xff0c;适用于构建各种规模的流媒体平台和应用。无论是搭建实时视频直播平台、点播系统或多屏互…

CPU眼里的C/C++:1.2 查看变量和函数在内存中的存储位置

写一个很简单的 c 代码&#xff0c;打印一些“地址”&#xff0c; 也就是变量、函数的“存储位置”&#xff1a;当程序被加载到内存后&#xff0c;它们具体是存在哪里&#xff0c;可以用精确的数值来表示&#xff0c;这就是内存地址。 https://godbolt.org/z/Ghh9ThY5Y #inc…

ETL实现实时文件监听

一、实时文件监听的作用及应用场景 实时文件监听是一种监测指定目录下的文件变化的技术&#xff0c;当产生新文件或者文件被修改时&#xff0c;可实时提醒用户并进行相应处理。这种技术广泛应用于数据备份、日志管理、文件同步和版本控制等场景&#xff0c;它可以帮助用户及时…

信钰证券:6G概念强势拉升,通宇通讯、世嘉科技涨停,硕贝德等走高

6G概念23日盘中拉升走高&#xff0c;到发稿&#xff0c;三维通讯、通宇通讯、世嘉科技涨停&#xff0c;硕贝德、信维通讯涨约8%&#xff0c;华力创通涨超7%。 音讯面上&#xff0c;华为中国日前发布音讯称&#xff0c;在IMT-2020(5G)推进组的安排下&#xff0c;华为已于9月11日…

STM32使用WWDG窗口看门狗

1 WWDG 介绍 1.1 WWDG 简介 窗口看门狗 WWDG 其实和独立看门狗类似&#xff0c;它是一个 7 位递减计数器不断的往下递减计数&#xff0c; 当减到一个固定值 0X40 时还不喂狗的话&#xff0c;产生一个 MCU 复位&#xff0c;这个值叫窗口的下限&#xff0c;是固定的值&#xf…

在Linux上安装RStudio工具并实现本地远程访问【内网穿透】

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…

关于Git的入门教程(附GitHub和Gitee的使用方法)

一. Git 概述 Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。Git易于学习、占地面积小、性能极快。它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCas…