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 中精准地设置用户权限,确保数据库的安全性和操作的规范性。

相关推荐
金銀銅鐵4 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
念何架构之路5 小时前
go-grpc设计思想
开发语言·后端·golang
system_error_x5 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
步行cgn7 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
码事漫谈8 小时前
AI 读你的提示词,其实很没耐心
后端
用户8356290780518 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我123458 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
IT_陈寒8 小时前
Java性能优化完全指南
前端·人工智能·后端
电子IT笔记9 小时前
对接群晖NAS,上传和删除踩坑记录
前端·后端
Mk598789 小时前
P4:把 Agent 的记忆搬进 Redis —— AgentScope-Java 工程化实战
后端