6.MongoDB连接和启用认证

6.MongoDB连接和启用认证


6.1 知识点

MongoDB 连接字符串格式

MongoDB 的连接字符串格式为 mongodb://<用户名>:<密码>@<主机>:<端口>/<数据库>?options

这个格式非常灵活,允许你提供多种选项来配置连接。

用户名和密码

  • **<用户名>**:连接到 MongoDB 数据库所需的用户名。
  • **<密码>**:该用户的密码。为了安全考虑,密码中的特殊字符(如 @/ 等)需要进行 URL 编码。

假设您的用户名是 user@example.com,密码是 pa/ss:word?,那么在连接字符串中,您需要这样处理:

  • 用户名 user@example.com 中的 @ 需要编码为 %40
  • 密码 pa/ss:word? 中的 / 需要编码为 %2F: 需要编码为 %3A? 需要编码为 %3F

因此,编码后的用户名和密码分别为:

  • 编码后的用户名:user%40example.com
  • 编码后的密码:pa%2Fss%3Aword%3F

主机和端口

  • **<主机>**:MongoDB 服务器的主机名或 IP 地址。可以是多个主机,用逗号分隔,用于复制集的连接。
  • **<端口>**:MongoDB 服务的端口,默认是 27017。如果使用默认端口,可以省略这个部分。

数据库

  • **<数据库>**:要连接的数据库名称。如果数据库不存在,MongoDB 会在首次插入数据时自动创建它。

选项(options)

选项是连接字符串中的可选参数,允许你修改连接的行为。以下是一些常用的选项及其解释:

  • authSource:指定身份验证数据库。如果用户在其他数据库中创建,但连接到一个不同的数据库时,需要使用此参数。

    例如,authSource=admin 表示在 admin 数据库中进行身份验证。

  • retryWrites:指定是否启用重试写入。设置为 true 时,如果写入操作失败,驱动程序将自动重试,默认值为 false

  • w:指定写入操作的确认级别。可以设置为 1(确认写入到主节点),majority(确认写入到大多数节点),或者 0(不需要确认)。

  • r:在执行写入操作时,指定读取的副本节点,可以与 w 一起使用。

  • ssl:指定是否使用 SSL/TLS 加密与 MongoDB 服务器之间的连接。设置为 true 时启用 SSL。

  • connectTimeoutMS:设置连接超时时间,单位为毫秒。默认是 30000 毫秒(30 秒)。

  • socketTimeoutMS:设置套接字超时时间,单位为毫秒。默认也是 30000 毫秒。

  • maxPoolSize:设置连接池的最大数量,默认是 100。

  • minPoolSize:设置连接池的最小数量,默认是 0。

连接字符串示例

不带任何验证

// 连接本地数据库
mongodb://localhost:27017/

// 连接指定IP的数据库
mongodb://127.0.0.1:27017/

带用户名和密码验证

mongodb://username:password@localhost:27017/

连接到指定的数据库

mongodb://username:password@localhost:27017/mydb

带选项参数

mongodb://username:password@localhost:27017/mydb?authSource=admin&retryWrites=true&w=majority

MongoDB启用认证

什么是Authentication(认证)

MongoDB 默认情况下是不启用身份验证的,需要修改配置文件或参数来启用它。

Authentication 是验证用户的身份,授予用户对资源和操作的访问权限

简而言之,认证是告诉我“你是谁”,授权是“你可以做什么”

访问控制很简单,只有三步:

  1. 启用访问控制
  2. 创建用户
  3. 认证用户

启动不带Authentication的服务

默认情况下,数据库是没有任何用户账号的,也就是说,在未启用访问控制时,任何人都可以直接访问数据库而无需验证身份。但是,一旦启动了访问控制功能,就必须通过指定的账号和密码进行登录验证,才能访问数据库。这种机制的目的是为了增强数据的安全性,防止未经授权的用户获取敏感数据或对数据库进行操作。

所以应该先启用访问控制的服务,在admin数据库中创建用户管理员账号并且赋予权限,然后用用户管理员登录(或者叫身份验证)成功以后才可以再创建其它用户。当然也可以直接使用这个账号进行数据库操作。

打开mongod.exe所在路径 例如在D:\Software\MongoDB\bin

命令行参数方式启动
mongod --bind_ip 127.0.0.1 --port 27017 --dbpath D:\Software\MongoDB\data
配置文件方式启动

首先在mongod.conf或mongod.cfg文件里找到以下内容并注释掉,如本来就没有那就不用修改

#security:
    #authorization: enabled

然后执行命令启动服务

mongod --config D:\Software\MongoDB\bin\mongod.cfg

数据库中添加账户

  1. 使用 MongoDB 提供的命令行工具连接到数据库中
  2. 切换到admin数据库
  3. 添加一个myUserAdmin用户,并赋予其“userAdminAnyDatabase”和“readWriteAnyDatabase”这两个角色
use admin
db.getUsers()  // 可以先用这个命令查询下当前数据库中的所有账号
db.createUser(
  {
    user: "myUserAdmin",
    pwd: passwordPrompt(), // or cleartext password
    roles: [
        { role: "userAdminAnyDatabase", db: "admin" },
          { role: "readWriteAnyDatabase", db: "admin" }
    ]
  }
)

注意:passwordPrompt()方法提示你输入密码。你也可以直接将密码指定为字符串。建议使用passwordPrompt()方法,以避免在屏幕上看到密码,并可能将密码泄露到shell历史记录中。

  • userAdminAnyDatabase 角色授予用户管理所有数据库的权限。
  • readWriteAnyDatabase 角色允许用户对所有数据库执行读写操作。

重新启动MongoDB服务

请务必避免直接使用 CTRL+C 或直接点击“停止服务”按钮来关闭 MongoDB 服务。这种强制关闭操作可能会导致数据未正确写入磁盘,进而损坏 MongoDB 的数据库文件。一旦发生文件损坏,下次启动时可能会出现无法预料的错误,甚至导致数据丢失或系统崩溃。

正确关闭 MongoDB 的方法是通过以下命令优雅地停止服务,以确保所有正在进行的操作完成并安全地将数据写入磁盘:

  • 使用 MongoDB 提供的命令行工具
// 该命令会优雅地关闭服务,确保所有缓冲区的内容写入磁盘。
db.adminCommand({ shutdown: 1 })

  • 通过系统服务管理工具关闭(适用于服务已注册的情况):
// 在 Linux 系统中,可以使用以下命令停止并重新启动服务
sudo systemctl restart mongod
// 在 Windows 系统中,可以通过服务管理器或执行以下命令停止
net stop MongoDB
// 执行以下命令启动
net start MongoDB

启动Authentication的服务

命令行参数方式启动
mongod --auth --bind_ip 127.0.0.1 --port 27017 --dbpath D:\Software\MongoDB\data

配置文件方式启动

首先在mongod.conf或mongod.cfg文件里找到以下内容并删掉注释,如没有就把下面内容粘贴到文件中

security:
    authorization: enabled

然后执行命令启动服务

mongod --config D:\Software\MongoDB\bin\mongo.conf
重新连接MongoDB

使用shell进行连接,输入mongodb://127.0.0.1:27017/,会发现可以连接 但是没有权限查数据库了

要使用带用户名的链接,mongodb://myUserAdmin:123456789@127.0.0.1:27017/

连接字符串特殊符号

在连接 MongoDB 时,如果用户名或密码中包含特殊字符(如 @/:? 等),你需要对这些特殊字符进行 URL 编码。URL 编码是将字符转换为可以在 URL 中安全传输的格式。这是因为某些字符在 URL 中具有特定的含义,比如 @ 用于分隔用户名和主机,: 用于分隔主机和端口。

URL 编码的基本规则

URL 编码的格式是将特殊字符替换为 % 后跟其 ASCII 十六进制值。例如:

  • 空格编码为 %20
  • @ 编码为 %40
  • / 编码为 %2F
  • : 编码为 %3A
  • ? 编码为 %3F
示例

假设您的用户名是 user@example.com,密码是 pa/ss:word?,那么在连接字符串中,您需要这样处理:

  • 用户名 user@example.com 中的 @ 需要编码为 %40
  • 密码 pa/ss:word? 中的 / 需要编码为 %2F: 需要编码为 %3A? 需要编码为 %3F

因此,编码后的用户名和密码分别为:

  • 编码后的用户名:user%40example.com
  • 编码后的密码:pa%2Fss%3Aword%3F
最终连接字符串

将编码后的用户名和密码放入连接字符串中,结果如下:

mongodb://user%40example.com:pa%2Fss%3Aword%3F@<主机>:<端口>/<数据库>
如何进行 URL 编码
  1. 网上搜索URL编码有很多在线工具可以编码
  2. 使用编程语言进行编码
  3. 使用如DevToys这样的工具进行编码

数据库权限角色

每个MongoDB的内置角色都定义了角色数据库中所有非系统集合的数据库级别的访问权限以及所有系统集合的集合级别的访问权限。

MongoDB为每个数据库提供内置的数据库用户和数据库管理角色。MongoDB仅在admin数据库上提供所有其他内置角色。

角色类型 角色名称 角色描述
Database User Roles read 提供在所有非系统集合和system.js集合中读取数据的能力。
readWrite 提供“read”角色的所有权限,外加在所有非系统集合和system.js集合中修改数据的能力。
Database Administration Roles dbAdmin 提供执行管理任务的能力,例如与数据库相关的任务、索引和收集统计信息。该角色不授予用户和角色管理权限。
dbOwner 数据库所有者可以对数据库执行任何管理操作。该角色结合了readWrite、dbAdmin和userAdmin三个角色的权限。
userAdmin 提供在当前数据库上创建和修改角色和用户的能力。
Cluster Administration Roles clusterAdmin 提供最大的集群管理访问。此角色结合了 clusterManager、clusterMonitor 和 hostManager 角色授予的权限。此外,该角色还提供 dropDatabase 操作的权限。
clusterManager 提供对集群的管理和监控操作的权限
clusterMonitor 提供对监控工具的只读访问权限
hostManager 提供监控和管理服务器的能力
Backup and Restoration Roles backup 提供备份数据所需的最低权限
restore 提供从备份中恢复数据所需的权限
All-Database Roles readAnyDatabase 提供和“read”角色相似的在所有数据库上的只读权限,local和config数据库除外
readWriteAnyDatabase 提供和“readWrite”角色相似的在所有数据库上的读写权限,local和config数据库除外
userAdminAnyDatabase 提供和“userAdmin”角色相似的在所有数据库上访问用户管理操作的权限,local和config数据库除外
dbAdminAnyDatabase 提供和“dbAdmin”角色相似的在所有数据库上管理操作的权限,local和config数据库除外
Superuser Roles root 超级用户,提供以下角色的所有权限:

- readWriteAnyDatabase
- dbAdminAnyDatabase
- userAdminAnyDatabase
- clusterAdmin
- restore
- backup
Internal Role __system MongoDB 将此角色分配给代表集群成员的用户对象,例如副本集成员和 mongos 实例。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏