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})

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能指数报告2023

人工智能指数报告2023 主要要点第 1 章 研究与开发第 2 章 技术性能第 3 章 人工智能技术伦理第 4 章 经济第 5 章 教育第 6 章 政策与治理第 7 章 多样性第 8 章 舆论 人工智能指数是斯坦福大学以人为本的人工智能研究所(HAI)的一项独立倡议&#xff0c…

CNN-LSTM-Attention混合神经网络归时序预测的MATLAB实现(源代码)

CNN-LSTM-Attention介绍: CNN-LSTM-Attention混合神经网络是一种结合了卷积神经网络(CNN)、长短期记忆神经网络(LSTM)和注意力机制(Attention)的模型。这种混合神经网络结合了CNN对空间特征的提…

【MySQL】查询语句:条件、排序和分页

基本查询 MySQL 数据库使用SELECT语句来查询数据。 查询字段 以下为在MySQL数据库中查询数据通用的 SELECT 语法: SELECT 字段名,字段名... FROM 表名;选择全部列 SELECT * FROM emp; -- 查询所有字段一般情况下,除非需要使用表中所有的字段数据&…

[HackMyVM] 靶场 Wave

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

【LeetCode:2368. 受限条件下可到达节点的数目 + BFS】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

MSCKF3讲:后端理论推导(上)

MSCKF3讲:后端理论推导(上) 文章目录 MSCKF3讲:后端理论推导(上)1 MSCKF中的状态变量① IMU状态:② cam0状态:③ IMU和cam0间状态关系 2 微分方程递推(数值解)3 IMU状态预…

leetcode - 2095. Delete the Middle Node of a Linked List

Description You are given the head of a linked list. Delete the middle node, and return the head of the modified linked list. The middle node of a linked list of size n is the ⌊n / 2⌋th node from the start using 0-based indexing, where ⌊x⌋ denotes th…

ABAP - SALV教程05 添加页眉和页脚

先看看效果叭CL_SALV_TABLE提供了SET_TOP_OF_LIST方法设置页眉显示和SET_TOP_OF_LIST_PRINT方法设置页眉打印来实现添加页眉的目的。CL_SALV_TABLE提供了SET_END_OF_LIST方法设置页脚显示和SET_END_OF_LIST_PRINT方法设置页脚打印来实现添加页脚的目的。这个四个方法的传入参数…

计算机二级Python刷题笔记------基本操作题11、14、17、21、30(考察列表)

文章目录 第十一题(列表遍历)第十四题(len)第十七题(len、insert)第二十一题(append)第三十题(二维列表) 第十一题(列表遍历) 题目&a…

你敢信,copilot Pro这个带着Pro的产品是阉割版?

你敢信,copilot Pro这个带着Pro的产品是阉割版? 没错。 很多人以为copilot Pro带着Pro就是专业版,高大上。 但不知道的是,微软对于office copilot同时发布了两款产品: 针对个人家庭版office用户的copilot Pro&…

【C语言】linux内核dev_hard_start_xmit

一、中文注释 struct sk_buff *dev_hard_start_xmit(struct sk_buff *first, struct net_device *dev,struct netdev_queue *txq, int *ret) {struct sk_buff *skb first; // 初始化skb指针,指向第一个待发送的数据包int rc NETDEV_TX_OK; // 初始返回码为NETD…

C++ set和map使用

set和map 1.关联式容器2. 键值对3. set3.1 介绍3.2 简单使用 4.multiset5.map5.1 介绍5.2 简单使用 6. multimap 1.关联式容器 关联式容器是一种STL容器,用于存储键-值对。它们提供了一种通过键来快速查找值的机制。STL总共实现了两种不同结构的管理式容器&#xff…

编写dockerfile挂载卷、数据容器卷

编写dockerfile挂载卷 编写dockerfile文件 [rootwq docker-test-volume]# vim dockerfile1 [rootwq docker-test-volume]# cat dockerfile1 FROM centosVOLUME ["volume01","volume02"]CMD echo "------end------" CMD /bin/bash [rootwq dock…

ecmascript 6+(2)

引用数据类型: Object, Array, RegExp, Date等 包装类型:(底层数据类型会将简单数据类型包装为对象) String, Number, Boolean等(都是基本数据类型的构造函数) Object Object.keys(对象) 返回数组&…

4款塞纸条盲盒交友源码,可以对接公众号

一元盲盒交友源码/脱单盲盒源码/交友盲盒/恋爱盲盒公众号版 可以对接自己支付,全部自定义 没有任何bug版本,已经测试完全可以 免费源码,不包搭建指导 源码下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

flink重温笔记(九):Flink 高级 API 开发——flink 四大基石之WaterMark(Time为核心)

Flink学习笔记 前言:今天是学习 flink 的第 9 天啦!学习了 flink 四大基石之 Time的应用—> Watermark(水印,也称水位线),主要是解决数据由于网络延迟问题,出现数据乱序或者迟到数据现象&…

Vue项目的快速搭建

Vue项目的快速搭建 一、下载并安装node.js二、安装Vue脚手架三、创建vue项目四、项目启动五、VS Code下载安装 一、下载并安装node.js 首先确保已经安装了Node.js。如果没有安装,可以去官网(https://nodejs.org/)下载并安装最新版本的Node.j…

CIP通讯介绍(欧姆龙PLC)

什么是CIP CIP通信是Common Industrial Protocl(CIP)的简称,它是一个点到点的面向对象协议,能够实现工业器件(传感器,执行器)之间的连接,和高等级的控制器之间的连接。目前,有3种网络DeviceNet…

c语言经典测试题9

1.题1 #include <stdio.h> int main() { int i 1; sizeof(i); printf("%d\n", i); return 0; } 上述代码运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;其实这题的难点就是sizeof操作后i的结果是否会改变&#xff0c;首先我们创建了一个整型i&a…

消息中间件之RocketMQ源码分析(二十七)

Broker提交或回滚事务消息 当生产者本地事务处理完成并且Broker回查事务消息后&#xff0c;不管执行Commit还是Rollback,都会根据用户本地事务的执行结果发送一个End_transaction的RPC请求给Broker&#xff0c;Broker端处理该请求的类是EndTransactionProcessor 第一步&…