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