MongoDB(73)如何设置用户权限?

在 MongoDB 中,用户权限是通过角色(roles)来管理的。每个角色集合了对数据库和集合的特定操作权限,通过将角色赋予用户,可以控制用户在数据库中的权限。以下是详细的步骤和代码示例,展示如何设置用户权限。

1. 连接到 MongoDB 实例

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

bash 复制代码
mongo

2. 切换到 admin 数据库

大多数管理操作,包括创建用户和设置权限,都是在 admin 数据库中完成的:

javascript 复制代码
use admin

3. 创建管理员用户

如果还没有管理员用户,需要先创建一个管理员用户,以便能够执行后续的管理操作:

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

4. 启用身份验证

编辑 MongoDB 配置文件 mongod.conf 来启用身份验证:

yaml 复制代码
security:
  authorization: enabled

重启 MongoDB 服务以应用配置更改:

bash 复制代码
sudo systemctl restart mongod

5. 创建用户和设置权限

切换到需要管理权限的目标数据库,并创建用户和分配角色。

5.1. 创建数据库用户

切换到目标数据库,例如 testdb

javascript 复制代码
use testdb

创建一个具有读写权限的数据库用户:

javascript 复制代码
db.createUser({
  user: "dbUser",
  pwd: "dbPassword",
  roles: [
    { role: "readWrite", db: "testdb" }
  ]
})
5.2. 创建只读用户

创建一个只读用户:

javascript 复制代码
db.createUser({
  user: "readonlyUser",
  pwd: "readonlyPassword",
  roles: [
    { role: "read", db: "testdb" }
  ]
})
5.3. 创建自定义角色

首先切换到 admin 数据库,然后创建自定义角色:

javascript 复制代码
use admin

创建一个自定义角色,例如 customRole,它具有对 testdb 数据库的特定权限:

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

将自定义角色赋予用户:

javascript 复制代码
use testdb

db.createUser({
  user: "customUser",
  pwd: "customPassword",
  roles: [
    { role: "customRole", db: "testdb" }
  ]
})

6. 更新现有用户权限

可以使用 updateUser 方法更新现有用户的权限。例如,给现有用户 dbUser 赋予额外的角色:

javascript 复制代码
db.updateUser("dbUser", {
  roles: [
    { role: "readWrite", db: "testdb" },
    { role: "customRole", db: "testdb" }
  ]
})

7. 验证权限

使用新创建的用户连接到 MongoDB 实例,并尝试执行一些操作,以验证权限是否正确:

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

在 MongoDB Shell 中:

javascript 复制代码
use testdb

// 读写测试
db.collection_name.insert({ "key": "value" }) // 应该成功
db.collection_name.find()                     // 应该成功
db.collection_name.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该成功
db.collection_name.remove({ "key": "newValue" }) // 应该成功

// 自定义角色权限测试
db.logs.insert({ "log": "entry" }) // 应该成功
db.logs.remove({ "log": "entry" }) // 应该成功
db.collection_name.drop() // 失败,如果用户没有删除集合的权限

总结

通过上述步骤,可以在 MongoDB 中创建用户、分配角色和权限,以及验证用户权限。以下是一个完整示例脚本,展示了如何设置用户权限:

bash 复制代码
#!/bin/bash

MONGO_HOST="localhost"
MONGO_PORT="27017"
ADMIN_USER="adminUser"
ADMIN_PASS="adminPassword"

# 管理员用户创建(如果尚未创建)
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

# 启用身份验证(编辑 mongod.conf 并重启 MongoDB 服务)
# security:
#   authorization: enabled

# 创建数据库用户
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" testdb <<EOF
db.createUser({
  user: "dbUser",
  pwd: "dbPassword",
  roles: [
    { role: "readWrite", db: "testdb" }
  ]
})
EOF

# 创建只读用户
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" testdb <<EOF
db.createUser({
  user: "readonlyUser",
  pwd: "readonlyPassword",
  roles: [
    { role: "read", db: "testdb" }
  ]
})
EOF

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

mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" testdb <<EOF
db.createUser({
  user: "customUser",
  pwd: "customPassword",
  roles: [
    { role: "customRole", db: "testdb" }
  ]
})
EOF

通过这些步骤和代码示例,可以在 MongoDB 中精准地设置用户权限,确保数据库的安全性和操作的规范性。

相关推荐
AI-好学者6 小时前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
其实防守也摸鱼7 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚8 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔7258 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋8 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
Database_Cool_8 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾8 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
IvorySQL10 小时前
PG 日报|社区讨论重构 pg_hba 配置文件格式
数据库·人工智能·postgresql·重构·ivorysql
逝水无殇10 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
罗政11 小时前
PDF 批量合并工具:本地 AI 自动排序、识别正文日期与合同编号
数据库·pdf·php