MongoDB(72)如何创建用户和角色?

在 MongoDB 中,用户和角色用于管理对数据库的访问和权限控制。通过创建用户和赋予角色,可以细粒度地控制用户对数据库的访问和操作权限。下面是详细的步骤和代码示例,展示如何创建用户和角色。

步骤1:连接到 MongoDB 实例

首先,使用 mongo 客户端连接到 MongoDB 实例:

bash 复制代码
mongo

步骤2:切换到适当的数据库

在 MongoDB 中,用户和角色是针对特定数据库创建的。切换到你希望创建用户的数据库。例如,如果你想在 admin 数据库中创建用户:

javascript 复制代码
use admin

步骤3:创建用户

使用 db.createUser 方法创建用户。以下是创建不同类型用户的示例代码:

3.1. 创建管理员用户

管理员用户具有管理整个 MongoDB 实例的权限。

javascript 复制代码
db.createUser({
  user: "adminUser",
  pwd: "adminPassword",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" }
  ]
})

3.2. 创建数据库用户

数据库用户具有对特定数据库的权限。例如,创建一个 testdb 数据库的读写用户:

javascript 复制代码
use testdb

db.createUser({
  user: "dbUser",
  pwd: "dbPassword",
  roles: [
    { role: "readWrite", db: "testdb" }
  ]
})

3.3. 创建只读用户

只读用户只能读取数据,不能进行写操作。例如,创建一个 testdb 数据库的只读用户:

javascript 复制代码
use testdb

db.createUser({
  user: "readonlyUser",
  pwd: "readonlyPassword",
  roles: [
    { role: "read", db: "testdb" }
  ]
})

步骤4:创建自定义角色

MongoDB 允许创建自定义角色,自定义角色可以组合多种权限。以下是一个创建自定义角色的示例:

4.1. 切换到 admin 数据库

javascript 复制代码
use admin

4.2. 创建自定义角色

javascript 复制代码
db.createRole({
  role: "customRole",
  privileges: [
    { resource: { db: "testdb", collection: "" }, actions: [ "find", "update" ] },
    { resource: { db: "testdb", collection: "logs" }, actions: [ "insert", "remove" ] }
  ],
  roles: []
})

这个自定义角色 customRole 具有以下权限:

  • 对 testdb 数据库的所有集合具有 find 和 update 操作权限。
  • 对 testdb 数据库的 logs 集合具有 insert 和 remove 操作权限。

步骤5:将角色赋予用户

可以将创建的自定义角色赋予用户。例如,将 customRole 赋予 dbUser:

javascript 复制代码
use testdb

db.updateUser("dbUser", {
  roles: [
    { role: "customRole", db: "testdb" }
  ]
})

步骤6:验证用户和角色

使用新创建的用户连接到 MongoDB 实例并验证权限。例如,使用 dbUser 连接到 testdb 数据库:

bash 复制代码
mongo -u "dbUser" -p "dbPassword" --authenticationDatabase "testdb"

尝试进行各种操作以验证权限:

javascript 复制代码
use testdb

// 验证读写权限
db.collection_name.insert({ "key": "value" })        // 应该成功
db.collection_name.find()                            // 应该成功
db.collection_name.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该成功

// 验证自定义角色权限
db.logs.insert({ "log": "entry" })                  // 应该成功
db.logs.remove({ "log": "entry" })                  // 应该成功
db.collection_name.drop()                           // 应该失败,除非用户有该权限

完整示例脚本

以下是一个完整的脚本,展示了如何创建用户和自定义角色:

bash 复制代码
#!/bin/bash

MONGO_HOST="localhost"
MONGO_PORT="27017"

# MongoDB 管理员用户
ADMIN_USER="admin"
ADMIN_PASS="adminPassword"

# 新用户和角色的配置
DB_NAME="testdb"
NEW_USER="dbUser"
NEW_PASS="dbPassword"
CUSTOM_ROLE="customRole"

# 创建管理员用户
mongo --host $MONGO_HOST --port $MONGO_PORT admin <<EOF
db.createUser({
  user: "$ADMIN_USER",
  pwd: "$ADMIN_PASS",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" }
  ]
})
EOF

# 创建自定义角色
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" admin <<EOF
db.createRole({
  role: "$CUSTOM_ROLE",
  privileges: [
    { resource: { db: "$DB_NAME", collection: "" }, actions: [ "find", "update" ] },
    { resource: { db: "$DB_NAME", collection: "logs" }, actions: [ "insert", "remove" ] }
  ],
  roles: []
})
EOF

# 创建新用户并赋予自定义角色
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" $DB_NAME <<EOF
db.createUser({
  user: "$NEW_USER",
  pwd: "$NEW_PASS",
  roles: [
    { role: "$CUSTOM_ROLE", db: "$DB_NAME" }
  ]
})
EOF

总结

通过上述步骤和代码示例,可以在 MongoDB 中创建用户、赋予角色和创建自定义角色。确保使用强密码,并根据具体需求细粒度地管理用户权限,以提升数据库的安全性和管理效率。

相关推荐
计算机魔术师2 小时前
我让AI教学生写前端,三天后课堂变了——Web教育者的集体反思
后端
Wx-bishekaifayuan3 小时前
springboot房屋租赁系统11574-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·sql·spring·课程设计
青山木3 小时前
秒杀系统设计(二):数据正确性——防超卖、分布式锁与一人一单
分布式·后端·mysql·中间件·架构
KING-WU5124 小时前
Linux 工具之 yum、vim、gcc
linux·运维·服务器·后端
蜗牛互联网4 小时前
GPT-6.1 Sol迁移指南:从token单价转向每任务成本门禁
java·人工智能·后端·gpt
IT_陈寒4 小时前
Redis键过期失效?这个坑我踩得明明白白
前端·人工智能·后端
蜗牛互联网4 小时前
HSTU在Dynamo-Triton中的AOTI与KV缓存验收方法
java·人工智能·后端·缓存
青山木4 小时前
秒杀系统设计(一):需求拆解与流量治理
java·数据库·redis·后端·架构
沫璃染墨4 小时前
《从零入门Linux系统篇(五十三):线程篇·六——线程互斥详解:从并发问题到mutex互斥锁》
linux·运维·服务器·开发语言·后端·架构·系统架构
魏码不凡5 小时前
Go 编译报错:undefined: webp.Encode 问题排查与解决
开发语言·后端·golang