Mongodb如何开启用户访问控制详解

发布时间 - 2026-01-10 22:47:35    点击率:

前言

Mongodb 数据库默认情况下是没有访问控制的,整个数据库对外是开发的,只要能连上数据库,则可以进行任何操作,这会对数据带来很大的风险。当然,我们可以启用mongodb的访问控制,只让通过认证的用户才能对数据库进行角色范围内的操作。

启用访问控制可以通过在启动 mongodb 时指定 --auth 参数来设置,另外还涉及到创建用户 db.createUser 操作以及一些角色的定义,我们先来看这部分内容。

db.createUser() 用法

db.createUser({
 user: "$USERNAME",
 pwd: "$PASSWROD",
 roles: [
 { role: "$ROLE_NAME", db: "$DBNAME"}
 ]
})

参数说明:

  • user 是用户名
  • pwd 是密码
  • role 来指定用户的角色
  • db 来指定所属的数据库
  • roles 是用户所有角色的集合

Mongodb 预定义角色

Mongodb 中预定义了一些角色,把这些角色赋予给适当的用户上,用户就只能进行角色范围内的操作。

1、数据库用户角色 (所有数据库都有)

  • read 用户可以读取当前数据库的数据
  • readWrite 用户可以读写当前数据库的数据

2、数据库管理角色(所有数据库都有)

  1. dbAdmin 管理员用户但不能对用户和角色管理授权
  2. dbOwner 数据库所有者可进行任何管理任务
  3. userAdmin 可以管理当前数据的用户和角色

3、集群管理角色(admin数据库可用)

  1. clusterAdmin 集群所有管理权限,是 clusterManager , clusterMonitor, hostManager 合集
  2. clusterManager 集群管理和监控
  3. clusterMonitor 集群监控,只读的
  4. hostManager 监控和管理服务器

4、备份和恢复角色(admin数据库可用)

  1. backup
  2. restore

5、所有数据库角色(admin数据库可用)

  1. readAnyDatabase 读取所有数据库
  2. readWriteAnyDatabase 读写所有数据库
  3. userAdminAnyDatabase 所有数据库的 userAdmin 权限
  4. dbAdminAnyDatabase 所有数据库的 dbAdmin 权限

6、超级角色(admin数据库可用)

  1. root 超级用户

7、内部角色

  • __system 所有操作权限

更多预定于角色的信息请参看:https://docs.mongodb.com/manual/core/security-built-in-roles/

启用访问控制的步骤

1, 启动 mongodb 实例,关闭 访问控制

不带 --auth

./mongod

2, 连接上 mongodb 实例

./mongo

3,创建用户管理员

在 admin 数据库中添加一个 具有 userAdminAnyDatabase 角色的用户作为用户管理用户。下面的例子中创建了 admin 为用户管理员。

> use admin
switched to db admin
> db.createUser({
... user: "admin",
... pwd: "admin",
... roles: [
... { role: "userAdminAnyDatabase", db: "admin"}
... ]
... })
Successfully added user: {
 "user" : "admin",
 "roles" : [
  {
   "role" : "userAdminAnyDatabase",
   "db" : "admin"
  }
 ]
}
>

退出连接

4,重启数据库启用访问控制

命令行启动,只需要添加 --auth 参数

./mongo --auth

5,使用管理用户连接,有两种方法

  1. 使用命令行 ./mongo -u "$USERNAME" -p "$PASSWROD" --authenticationDatabase "admin"
  2. 使用 db.auth()

我们使用第二种

> 
> use admin
switched to db admin
> db.auth("admin", "admin")
1
>

1 表示认证成功

6, 为某个数据库创建独立用户

以下为 test 数据库 创建具有读写权限的用户 test

admin 用户由于只有 userAdminAnyDatabase 权限,所以没有 test 数据的读写权限,所以,为了读写 test 数据库,我们需要创建一个用户。先看一下直接用 admin 会报什么错误

> use test
> show collections
2017-01-13T13:49:17.691+0800 E QUERY [thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {} }",
"code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16
shellHelper.show@src/mongo/shell/utils.js:754:9
shellHelper@src/mongo/shell/utils.js:651:15
@(shellhelp2):1:1

我们直接使用 show collections , 则报错:not authorized on test to execute command ,意思是没有权限。

> use test
switched to db test
> db.createUser({
... user: "test",
... pwd: "test",
... roles: [
... { role: "readWrite", db: "test"}
... ]
... })
Successfully added user: {
 "user" : "test",
 "roles" : [
  {
   "role" : "readWrite",
   "db" : "test"
  }
 ]
}
>

然后我们使用 db.auth(“test”, “test”) , 再执行命令 则没有报错

> db.auth("test", "test")
1
> 
> show collections

试着写入一条数据,也是正常的。

> db.t.insert({name:"buzheng"});
WriteResult({ "nInserted" : 1 })
> db.t.find();
{ "_id" : ObjectId("58786c84bf5dd606ddfe1144"), "name" : "buzheng" }
>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# mongodb  # 访问控制  # 启用访问控制  # mongodb添加访问控制  # MongoDB 3.0+安全权限访问控制详解  # 分布式文档存储数据库之MongoDB备份与恢复的实践详解  # 分布式文档存储数据库之MongoDB分片集群的问题  # 分布式文档存储数据库之MongoDB访问控制的操作方法  # 都有  # 用户可以  # 报错  # 会报  # 命令行  # 我们可以  # 这部  # 可以通过  # 只需要  # 这篇文章  # 有两种  # 涉及到  # 不带  # 则可  # 试着  # 重启  # 但不  # 能对  # 合集 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: js实现点击每个li节点,都弹出其文本值及修改  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel如何为API编写文档_Laravel API文档生成与维护方法  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  黑客如何通过漏洞一步步攻陷网站服务器?  青岛网站建设如何选择本地服务器?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel集合Collection怎么用_Laravel集合常用函数详解  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何撰写建站申请书?关键要点有哪些?  如何用搬瓦工VPS快速搭建个人网站?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  微信小程序 input输入框控件详解及实例(多种示例)  如何用y主机助手快速搭建网站?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  如何快速登录WAP自助建站平台?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  黑客如何利用漏洞与弱口令入侵网站服务器?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  利用 Google AI 进行 YouTube 视频 SEO 描述优化  高防服务器:AI智能防御DDoS攻击与数据安全保障  北京的网站制作公司有哪些,哪个视频网站最好?  JavaScript如何实现错误处理_try...catch如何捕获异常?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel如何实现API速率限制?(Rate Limiting教程)  如何快速搭建支持数据库操作的智能建站平台?  javascript读取文本节点方法小结  网站制作壁纸教程视频,电脑壁纸网站?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  浅析上传头像示例及其注意事项  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  企业网站制作这些问题要关注  HTML 中如何正确使用模板变量为元素的 name 属性赋值  PHP 500报错的快速解决方法  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  JS弹性运动实现方法分析  EditPlus中的正则表达式 实战(1)  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程