docker-compose 安装MongoDB续:创建用户及赋权

文章目录

  • 1. 问题描述
  • 2. 分析
    • 2.1 admin
    • 2.2 config
    • 2.3 local
  • 3. 如何连接
  • 3.解决

1. 问题描述

在这一篇使用docker-compose创建MongoDB环境的笔记里,我们创建了数据库,但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误:
请添加图片描述
从截图可以看出,明显是Authorization失败了。

2. 分析

我们使用了这样的docker-compose.yaml文件来创建MongoDB的环境:

version: "3.8"
services:mongodb:container_name: mongodbimage: mongo:6.0ports:- 27017:27017restart: "no"volumes:- $PWD/data:/data/db- $PWD/logs:/var/log/mongodbenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: 123456

配置文件

# mongod.conf# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data.
storage:dbPath: /var/lib/mongodbjournal:enabled: true
#  engine:
#  wiredTiger:# where to write logging data.
systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.log# network interfaces
net:port: 27017bindIp: 0.0.0.0# how the process runs
processManagement:timeZoneInfo: /usr/share/zoneinfo#security:
auth=true#operationProfiling:#replication:#sharding:## Enterprise-Only Options:#auditLog:#snmp:

在启动数据库环境的时候,这里的INITDB的username和password都是赋值了的,但是这里并不能用这个用户名和密码进行登录。
那么这个用户名和密码是用来做什么的呢?
这个用户名和密码其实是数据库预设的admin库的。我们是可以用这个用户名和密码登录的。请添加图片描述
MongoDB一共有三个系统预设的库:

  • admin
  • config
  • local
    他们分别是用来做什么的呢?

2.1 admin

admin库是用来存储MongoDB的用户、角色等信息。
当MongoDB启用auth选项时,用户需要创建数据库帐号,访问时根据帐号信息来鉴权,而数据库帐号信息就存储在admin数据库下。

root@5db7fcc96e0f:/# mongosh -u root -p 123456
Current Mongosh Log ID:	661f969bdedb617b6878c1b9
Connecting to:		mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0
Using MongoDB:		6.0.2
Using Mongosh:		1.6.0For mongosh info see: https://docs.mongodb.com/mongodb-shell/------The server generated these startup warnings when booting2024-04-17T07:59:25.043+00:00: vm.max_map_count is too low
------------Enable MongoDB's free cloud-based monitoring service, which will then receive and displaymetrics about your deployment (disk utilization, CPU, operation statistics, etc).The monitoring data will be available on a MongoDB website with a unique URL accessible to youand anyone you share the URL with. MongoDB may use this information to make productimprovements and to suggest MongoDB products and deployment options to you.To enable free monitoring, run the following command: db.enableFreeMonitoring()To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
------test> show dbs;
admin   148.00 KiB
config  108.00 KiB
local    72.00 KiB
test> use admin
switched to db admin
admin> ls
ReferenceError: ls is not defined
admin> show collections;
system.users
system.version
admin> db.getCollection("system.version").find();
[{ _id: 'featureCompatibilityVersion', version: '6.0' },{ _id: 'authSchema', currentVersion: 5 }
]
admin> db.getCollection("system.users").find();
[{_id: 'admin.root',userId: new UUID("c0456cdb-ee1a-4ac7-a0de-695e48446983"),user: 'root',db: 'admin',credentials: {'SCRAM-SHA-1': {iterationCount: 10000,salt: '+wMEd3wWYjx5M2tuH/S7pg==',storedKey: 'juZ6GSX1639pJM4Xg99X/YLeIiI=',serverKey: 'KH9M9gFvo9DhvHlphTjrLG5HtoM='},'SCRAM-SHA-256': {iterationCount: 15000,salt: 'xJ84t11r+CStAF0EODvMzqPATo5RM8yDallqgA==',storedKey: 'ykgIr3CzzozJnQC5p6dt4quqQs8hcU1npBZFF9Q7b1g=',serverKey: 'C2Y/QrAVVdOTicGCwoAlb0RTYRJMLU02LF+iAQc/WkE='}},roles: [ { role: 'root', db: 'admin' } ]}
]
admin>

admin库里有两个collection:

  • system.version,这张表里存放的是MongoDB的版本信息和authSchema的版本信息。
  • system.users 用户的信息,包括角色

用户可以在admin数据库下建立任意集合,存储任何数据,但强烈建议不要使用admin数据库存储应用业务数据,最好创建新的数据库。
  admin数据库里的system.users、system.roles2个集合的数据MongoDB会cache在内存里,这样不用每次鉴权都从磁盘加载用户角色信息。目前cache的维护代码,只有在保证system.users、system.roles的写入都串行化的情况下才能正确工作。
  MongoDB admin数据库的写入操作的锁级别只能到DB级别,不支持多个collection并发写入,在写入时也不支持并发读取。如果用户在admin数据库里存储业务数据,则可能遭遇性能问题。

2.2 config

config库在使用MongoDB分片功能时起到作用,主要存储分片集群基础信息。
(挖个坑,以后再填,这里没怎么研究过)

2.3 local

local库它只会在本地存储数据,local数据库里的内容不会同步到副本集里其他节点上去;local数据库主要存储副本集的配置信息、oplog信息。
另外,对于重要的数据不能存储在local数据库,还要注意MongoDB默认的WriteConcern是{w: 1},即数据写到Primary上(不保证journal已经写成功)就向客户端确认,这时同样存在丢数据的风险。对于重要的数据,可以设置更高级别的如{w: “majority”}来保证数据写到大多数节点后再向客户端确认,当然这对写入的性能会造成一定的影响。

3. 如何连接

我们可以连接上admin库,那么我们就可以创建数据库,也可以为数据库创建用户,并指定用户的角色,根据不同角色赋予不同的权利。

test> use phone;
switched to db phone
phone> show dbs;
admin   100.00 KiB
config   72.00 KiB
local    72.00 KiB
admin> use admin;
admin> db.auth('root','123456');
{ ok: 1 }
admin> use phone;
switched to db phone
phone> db.createUser({user:'yy',pwd:'yy123456',roles:[{role:"readWrite", db:"phone"}]});
{ ok: 1 }

这里先创建了数据库phone,然后创建了用户yy,并设置密码为yy123456,赋予的role是读写。

数据库用户角色主要read和readWrite。
详细的角色信息看这里内置角色

3.解决

在执行完上面的操作后,就可以通过Robo 3T连接数据库了。
请添加图片描述

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

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

相关文章

Docker容器逃逸-特权模式-危险挂载-Procfs

Docker容器逃逸-特权模式-危险挂载 Docker这个概念&#xff1a; Docker 容器与虚拟机类似&#xff0c;但二者在原理上不同&#xff0c;容器是将操作系统层虚拟化&#xff0c;虚拟机则是虚拟化硬件&#xff0c;因此容器更具有便携性、高效地利用服务器。 ‍ Docker会遇到的安…

FPGA中闪灯程序设计示例

在FPGA设计中&#xff0c;闪灯的作用主要是用于测试和验证设计的功能和性能。具体来说&#xff0c;闪灯可以作为一个可视化的指示器&#xff0c;通过控制LED灯的闪烁模式和频率&#xff0c;来显示FPGA的工作状态或调试信息。 例如&#xff0c;在设计过程中&#xff0c;可以编写…

AI时代,操作系统交互的革命性变革

AI时代对操作系统交互的影响 对于2024年的智能手机厂商们来说&#xff0c;在冲击高端市场的路上有一场绝对输不起的硬仗&#xff0c;那就是AI大模型的落地之战。 OpenAI的ChatGPT引爆了全球AIGC&#xff08;生成式人工智能&#xff09;热潮&#xff0c;短短一年时间里&#xff…

学习51单片机 C语言知识

一、数据类型 C 语言包含的数据类型如下图所示 C51 的数据类型分为基本数据类型和组合数据类型&#xff0c;情况与标准 C 中的数据类型基本相同&#xff0c;但其中 char 型与 short 型相同&#xff0c;float 型与 double 型相同&#xff0c;另外&#xff0c;C51 中还有专门针…

线性表的链式存储(双向循环链表)

文章目录 前言一、双向循环链表是什么&#xff1f;二、双向循环链表的意义三、双向循环链表的操作实现总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#xff0c;便于日后复习&#xff08;这种事情不要啊&#xff09;。所用教材为《数据结…

RK3568 android11 修改关机弹窗界面

需要修改关机弹窗界面&#xff0c;当前界面我已经按照客户需求去掉emergency 但是客户需要按其他区域可以实现返回&#xff0c;也就是点击黑色背景取消dialog 嗑代码发现黑色布局为&#xff1a; <node index"0" text"" resource-id"com.android.…

【Python系列】python 如何打印带时间的日志

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int n 5;int result 0;int sum 0;//运算&#…

[Meachines][Easy]Crafty

Main $ sudo nmap -p- -sS -T4 10.10.11.249 发现25565端口是我的世界服务器端口 CVE-2021-44228: https://nodecraft.com/blog/service-updates/minecraft-java-edition-security-vulnerability在阿帕奇Log4j图书馆&#xff0c;广泛使用的记录框架&#xff0c;在Java应用程序…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制伊甸火山3D网格曲面图

11.4.2小节我们使用3D曲面图可视化分析伊甸火山数据&#xff0c;本小节我们采用3D网格曲面图可视化分析伊甸火山数据&#xff0c;以展示其地形&#xff0c;具体示例代码如下。 购书地址&#xff1a;https://item.jd.com/14102657.html

局域网无法连接怎么办?

局域网连接是我们日常生活和工作中常用的方式之一&#xff0c;但有时我们可能会遇到局域网无法连接的问题。这给我们的工作和生活带来了很大的困扰。本文将介绍局域网无法连接的常见原因&#xff0c;并推荐一款名为【天联】的组网产品&#xff0c;它能够解决不同地区间的局域网…

js 函数节流和函数防抖及区别详解

文章目录 1. 前言2. 函数节流3. 函数防抖4. 总结 1. 前言 浏览器中总是有一些操作非常耗费性能。所以就有了函数节流和函数防抖来提高浏览器性能。 函数节流&#xff1a;频繁触发一个事件时候&#xff0c;每隔一段时间&#xff0c;函数只会执行一次。 函数防抖&#xff1a;当触…