03、MongoDB -- MongoDB 权限的设计

目录

  • MongoDB 权限的设计
    • 演示前准备:启动 mongodb 服务器 和 客户端 :
      • 1、启动单机模式的 mongodb 服务器
      • 2、启动 mongodb 的客户端
    • MongoDB 权限的设计
      • 1、MongoDB 的每个数据库都可以保存用户,不止admin数据库可以保存用户。
      • 2、保存用户的数据库和该用户有权限操作的数据库完全可以是不同的。
      • 3、当用户登录时,必须在保存该用户的数据库中才能登录。
      • 4、该用户登录之后,能否操作哪个数据库,才能看出来该用户对哪些数据库有操作权限。
      • 5、在MongoDB中创建一个数据库之后,应该在该数据库中创建自己存储的用户,否则就无法在初始连接时仅通过该数据库建立连接

MongoDB 权限的设计

演示前准备:启动 mongodb 服务器 和 客户端 :

本次演示,只需要启动一个 单机模式的 mongodb 服务器 和 一个 mongodb 的客户端,

1、启动单机模式的 mongodb 服务器


打开命令行窗口,执行如下命令即可启动 MongoDB 服务器了

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"

就是只启动一个 mongodb 的服务器

在这里插入图片描述


2、启动 mongodb 的客户端

启动 mongodb 的客户端,指定要连接的 mongodb 服务器的端口号:

mongo mongodb://192.168.0.107:27017

即可启动 mongodb 的客户端

启动成功,如图:

在这里插入图片描述

之所以只需要输入 mongo 就能启动 mongodb 的客户端,是因为我之前把 mongodb 的 bin 目录添加到 path 环境变量里面 。


MongoDB 权限的设计


1、MongoDB 的每个数据库都可以保存用户,不止admin数据库可以保存用户。

这一点和传统数据库只能使用系统数据库来保存用户是截然不同的。


2、保存用户的数据库和该用户有权限操作的数据库完全可以是不同的。

比如 ljh 这个用户保存在 【admin】这个数据库里面,但是创建 ljh 这个用户的时候,只给这个用户操作【springboot】这个数据库的权限。
所以虽然 ljh 这个用户是在【admin】 这个数据库创建的,当时确没有操作【admin】数据库的权限。


3、当用户登录时,必须在保存该用户的数据库中才能登录。

比如我登录到 admin 这个数据库

mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456

然后创建一个数据【hahaha】
在这里插入图片描述

在【hahaha】数据库添加一个用户叫 AAA,然后这个用户对这个数据库有读写的权限
userAdmin:允许对指定数据库执行用户管理的权限,比如创建、删除和修改用户

db.createUser({ user: "AAA",pwd: "123456",roles: [{ role: "readWrite", db: "hahaha" },{ role: "userAdmin", db: "hahaha" }]});

重点来了:这个用户是创建在【hahaha】这个数据库里面的。

在这里插入图片描述

演示用户登录时,先演示登录到保存该用户的数据中

mongo mongodb://192.168.0.107:27017/hahaha -u AAA -p 123456

如图,登录成功,还能执行查看用户的操作,说明登录成功没问题。
因为 【AAA】这个用户是保存在【hahaha】这个数据库中的,说明当用户登录时,必须在保存该用户的数据库中才能登录。
在这里插入图片描述


AAA 用户是保存在【hahaha】数据库的,现在看能不能登录到 admin 数据库

mongo mongodb://192.168.0.107:27017/admin -u AAA -p 123456

如图:登录失败,这就说明了当用户登录时,必须在保存该用户的数据库中才能登录。

在这里插入图片描述

【注意】此时的【hahaha】数据库只是添加了 【AAA】这个用户,还不算是真正创建出这个数据库来,
所以给这个数据库添加一条数据,【hahaha】数据库才算是真正创建出来。

在这里插入图片描述


4、该用户登录之后,能否操作哪个数据库,才能看出来该用户对哪些数据库有操作权限。

【切记:】 用户保存在哪个数据库中,用户初始登录时就必须连接该数据库——只有连接该数据库才能验证用户。

这个在第3点也说了,就是 【AAA】这个用户,是保存在【hahaha】这个数据库里面的,所以在初始登录的时候,【AAA】这个用户只有指定是登录【hahaha】这个数据库,才能登录成功,授权成功。


这里再演示一遍:

登录mongodb时,【admin -u admin -p 123456】这个指定【登录的数据库、账号和密码】,就是初始登录时连接的数据

mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456

1、登录的是admin用户,登录的数据库是保存admin用户的【admin】数据库,所以admin这个用户可以正常使用命令查看数据库

在这里插入图片描述


2、登录的是 AAA 用户,AAA用户是保存在【hahaha】数据库里面的,但是此时的初始登录,连接的是admin 数据库

mongo mongodb://192.168.0.107:27017/admin -u AAA -p 123456

如图:AAA用户在初始登录时,验证授权没通过,因为用户保存在哪个数据库中,用户初始登录时就必须连接该数据库——只有连接该数据库才能验证用户
在这里插入图片描述


3、登录的是 AAA 用户,AAA用户是保存在【hahaha】数据库里面的,此时的初始登录,连接的就是【hahaha】数据库

mongo mongodb://192.168.0.107:27017/hahaha -u AAA -p 123456

如图:AAA用户登录之后,能操作到【hahaha】数据库这个数据库,报名这个用户有操作这个数据库的权限。

但是如图,它只能查看到 【hahaha】这个数据库,也表明它只对这个数据库有操作权限。

在这里插入图片描述

注意:因为 AAA 用户只有操作 【hahaha】 数据库的权限,所以查看命令也只能查看到自己有权限操作的数据库。
admin 之所以能查看所有数据库,是因为在之前设置时,把它设置成管理员。


5、在MongoDB中创建一个数据库之后,应该在该数据库中创建自己存储的用户,否则就无法在初始连接时仅通过该数据库建立连接

如图:根据3、4点的解释,来说明:登录的是 AAA 用户,AAA用户是保存在【hahaha】数据库里面的,但是此时的初始登录,连接的是admin 数据库,所以就无法在初始连接时与该数据库建立连接。

在这里插入图片描述


演示:

说明:如果你希望程序可以一开始就能连接你所创建的数据库,

  1. 你应该在该数据库中创建自己的用户。

  2. 且要让该用户有操作本数据库的权限——否则你只能登录,登录之后根本就无法访问该数据库。

    【通常:】 通常保存用户的数据库,跟用户有权限操作的数据库还是应该相同,这样才更符合逻辑。

1、创建一个springboot的数据库

在这里插入图片描述

2、在springboot中创建一个用户,且要让该用户有操作本数据库的权限
(这个用户只有读写的权限)

账号:LJHCCC
密码:123456

db.createUser({ user: "LJHCCC",pwd: "123456",roles: [{ role: "readWrite", db: "springboot" },{ role: "userAdmin", db: "springboot" }]});

在这里插入图片描述

在启动一个命令行窗口,登录这个数据库

mongo mongodb://192.168.0.107:27017/springboot -u LJHCCC -p 123456

如图:在MongoDB中创建一个数据库(springboot)之后,在该数据库中创建自己存储的用户(LJHCCC),就可以在初始连接时通过该数据库建立连接

因为 LJHCCC 这个用户只能操作 springboot 这个数据库,
所以查看有哪些数据库时,也只能查到有他操作权限的那个数据库

在这里插入图片描述

在这里插入图片描述







演示创建一个数据库,然后添加一个用户,这个数据库还是没有被真正创建出来,只有往该数据库插入数据,才能算是正在创建出该数据库。

账号:LJHAAA
密码:123456

db.createUser({ user: "LJHAAA",pwd: "123456",roles: [{ role: "readWrite", db: "local" },{ role: "userAdmin", db: "local" },{ role: "readWrite", db: "springboot" },{ role: "userAdmin", db: "springboot" }]});

在这里插入图片描述

在这里插入图片描述

添加一条数据的命令:db.test.insert({“aaa”:1})

在这里插入图片描述

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

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

相关文章

Linux 学习笔记(8)

八、 启动引导 1 、 Linux 的启动流程 1) BIOS 自检 2) 启动 GRUB/LILO 3) 运行 Linux kernel 并检测硬件 4) 挂载根文件系统 5) 运行 Linux 系统的第一个进程 init( 其 PID 永远为 1 ,是所有其它进程的父进程 ) 6) init 读取系统引导配置文件…

GD25Q32驱动

GD25Q32是一款基于SPI的Flash芯片,容量为32/84M bytes。它的引脚如下: 该芯片支持多种SPI操作方式,包括:Standard SPI(标准SPI)、Dual SPI(双线 SPI)和Quad SPI(四线 SPI) 。有关SPI的介绍可以参考: SPI通信原理-CSDN…

flutter 文字一行显示,超出换行

因为app有多语言,中文和其他语言长度不一致,可能导致英文会很长。 中文样式 英文样式 代码 Row(mainAxisAlignment: MainAxisAlignment.end,crossAxisAlignment: CrossAxisAlignment.end,children: [Visibility(visible: controller.info.fee ! null,ch…

探寻2024年国内热门低代码平台排行!| 功能特点一览

低代码开发是一项革命性的技术,主要目的是尽量避免程序研发的复杂性,让外行开发者也能加入到应用程序的搭建中。低代码平台的核心概念和构成部分通常包括用户界面和拖拽设计、预构件和模块、自动化工作内容与数据库集成和扩展应用,应用低代码…

U盘弹出提示“该设备正在使用中”:原因与解决方案

在日常使用U盘时,我们可能会遇到一个问题:当尝试安全弹出U盘时,系统提示“该设备正在使用中”。这种情况可能会让用户感到困惑,担心数据是否安全或是否会导致U盘损坏。本文旨在探讨这一现象背后的原因,并提供相应的解决…

【前端素材】推荐优质后台管理系统网页Stisla平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具,通常由管理员使…

铅冶炼作业VR虚拟现实互动培训平台降低实操风险

在钢铁工业中,焦炉作业是一个关键的环节,也是一项技术要求高、操作复杂的任务。传统焦炉作业的培训通常需要在实际的焦炉上进行,这不仅对学员的身体素质和心理素质提出了较高的要求,而且也存在一定的安全风险。基于VR虚拟现实制作…

React富文本编辑器开发(三)

现在我们的编辑器显示的内容很单一,这自然不是我们的目标,让呈现的内容多元化是我们的追求。这就需要让编辑器能够接收多元素的定义。从初始数据的定义我们可以推断数据的格式远不止一种,那么其它类型的数据如何定义及呈现的呢,我…

手把手教你免费用Flashduty做消息通知

为什么需要消息通知? 如果有重要的情况发生,希望能通过各种媒介通知我们。可以举几个例子: 家里燃气费没有了,希望能有短信或者app通知api频繁500报错,希望及时感知,及时修复公司网站是https自签名证书&a…

白话大模型① :AI分析能做什么?在实际落地中会碰到什么问题?

白话大模型系列共六篇文章,将通俗易懂的解读大模型相关的专业术语。本文为第一篇:AI分析能做什么?在实际落地中会碰到什么问题? 作者:星环科技 人工智能产品部 我们使用一个简单的应用实例来解析人工智能分析都在做什…

若依框架使用mars3d的环境配置,地球构建

因项目需要,原本使用过的cesium依赖,现在想使用火星科技mars3d的一些功能,所以需要引入mars3d依赖,整个过程非常的坎坷,以至于我都不知道到底是哪些部分是标准的。。。先把我认为对的记录一下: 1.vue.conf…

sqlserver保存微信Emoji表情

首先将数据库字段,设置类型为 nvarchar(200)一个emoji表情,占4字节就可以了,web前端展示不用改任何东西,直接提交数据保存;回显也会没有问题,C#代码不用做任何处理; 不哭不闹要睡觉&#x1f31…

【机器学习300问】24、模型评估的常见方法有哪些?

一、为什么要对模型进行评估? 对机器学习和神经网络的模型进行评估是至关重要的,原因如下: 得知模型的泛化能力 模型评估的主要目的是了解模型在未见过的数据上的表现,即其泛化能力。这是因为模型的性能在训练数据上可能会过拟合…

构建大语言模型的四个主要阶段

大规模语言模型的发展历程虽然只有短短不到五年的时间,但是发展速度相当惊人,国内外有超过百种大模型相继发布。中国人民大学赵鑫教授团队在文献按照时间线给出 2019 年至 2023 年比较有影响力并且模型参数量超过 100 亿的大规模语言模型。大规模语言模型…

LangFlow——一款可轻松实验和原型化 LangChain流水线的AI项目

LangFlow——一款可轻松实验和原型化 LangChain流水线的AI项目。 前言 在人工智能兴起的当下,AI正在重塑着很多行业。今天介绍的是一款近期登上github热门的一款可轻松实验和原型化 LangChain[1] 流水线的AI项目—LangFlow。 Flowise——通过拖放界面构建定制的LLM…

Flask学习笔记

不论POST请求还是GET请求都支持在 URL 中添加变量&#xff0c;可以选择性的加上一个转换器&#xff0c;为变量指定数据类型。 history_alarm.route(/test/<int:post_id>, methods[POST]) def test(post_id):print(f"参数类型为&#xff1a;{type(post_id)}")i…

VUE3中的组件传值

一、父传子(props) 在子组件中可以使用defineProps接收父组件向子组件的传值 父组件fatherPage.vue&#xff1a; <template><div class"father"><button click"a a 1">按钮</button><childPage :a"a" /><…

Nginx 隐藏版本信息和logo

1.隐藏版本信息 http {### 隐藏版本号 server_tokens off; } 2.隐藏图标 2.1 cd nginx 安装的路径 cd/XXXX/nginx-1.2.0 2.2 编辑文件 vim src/core/nginx.h 修改define nginx_ver 中的内容 vim src/http/ngx_http_special_response.c 修改 u_char ngx_http_error_tail[]…

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习&#xff0c;上部分就是对于java的基础知识&#xff0c;面向对象上&#xff0c;面向对象下&#xff0c;异常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读 摘要简介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 实验结果5 总结 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/2402.18293 源码…