数据库级别和集合级别的访问控制是 MongoDB 中控制用户权限和访问的两种主要方法。通过这些控制,管理员可以细粒度地管理用户对数据库和集合的访问权限,确保数据的安全性和操作的规范性。
数据库级别的访问控制
数据库级别的访问控制是指用户对整个数据库的权限控制。这种权限控制应用于数据库中的所有集合。
示例:数据库级别的访问控制
-
连接到 MongoDB 实例:
mongo -
切换到
admin数据库:use admin -
创建数据库用户:
切换到目标数据库,例如
testdb,然后创建一个具有读写权限的用户:use testdb db.createUser({ user: "dbUser", pwd: "dbPassword", roles: [ { role: "readWrite", db: "testdb" } ] })上述代码为
testdb数据库创建了一个用户dbUser,该用户具有读写权限。 -
验证数据库级别权限:
使用新创建的用户连接到 MongoDB,并尝试对
testdb数据库进行操作:mongo -u "dbUser" -p "dbPassword" --authenticationDatabase "testdb"在 MongoDB Shell 中:
use testdb db.collection1.insert({ "key": "value" }) // 应该成功 db.collection1.find() // 应该成功 db.collection2.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该成功用户
dbUser在testdb数据库中具有对所有集合的读写权限。
集合级别的访问控制
集合级别的访问控制是指用户对特定集合的权限控制。这种权限控制应用于指定集合,而不影响数据库中的其他集合。
示例:集合级别的访问控制
-
连接到 MongoDB 实例:
mongo -
切换到
admin数据库:use admin -
创建自定义角色:
创建一个自定义角色,该角色具有对
testdb数据库中某些集合的特定权限:db.createRole({ role: "collectionRole", privileges: [ { resource: { db: "testdb", collection: "collection1" }, actions: [ "find", "insert" ] }, { resource: { db: "testdb", collection: "collection2" }, actions: [ "update", "remove" ] } ], roles: [] })上述代码创建了一个角色
collectionRole,它具有:- 对
testdb数据库中collection1集合的find和insert操作权限。 - 对
testdb数据库中collection2集合的update和remove操作权限。
- 对
-
创建用户并赋予集合级别权限:
切换到目标数据库
testdb,然后创建一个用户并赋予自定义角色:use testdb db.createUser({ user: "collectionUser", pwd: "collectionPassword", roles: [ { role: "collectionRole", db: "testdb" } ] }) -
验证集合级别权限:
使用新创建的用户连接到 MongoDB,并尝试对
testdb数据库中的指定集合进行操作:mongo -u "collectionUser" -p "collectionPassword" --authenticationDatabase "testdb"在 MongoDB Shell 中:
use testdb // 对 collection1 的操作 db.collection1.insert({ "key": "value" }) // 应该成功 db.collection1.find() // 应该成功 db.collection1.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该失败 db.collection1.remove({ "key": "value" }) // 应该失败 // 对 collection2 的操作 db.collection2.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该成功 db.collection2.remove({ "key": "newValue" }) // 应该成功 db.collection2.find() // 应该失败 db.collection2.insert({ "key": "value" }) // 应该失败用户
collectionUser仅对collection1和collection2集合具有特定的操作权限,而其他集合则没有权限。
总结
通过数据库级别和集合级别的访问控制,MongoDB 可以灵活地管理用户权限,确保数据的安全性和操作的规范性。以下是一个完整示例脚本,展示了如何设置数据库级别和集合级别的访问控制:
#!/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" admin <<EOF
db.createRole({
role: "collectionRole",
privileges: [
{ resource: { db: "testdb", collection: "collection1" }, actions: [ "find", "insert" ] },
{ resource: { db: "testdb", collection: "collection2" }, actions: [ "update", "remove" ] }
],
roles: []
})
EOF
# 为自定义角色创建用户并赋予权限
mongo --host $MONGO_HOST --port $MONGO_PORT -u "$ADMIN_USER" -p "$ADMIN_PASS" --authenticationDatabase "admin" testdb <<EOF
db.createUser({
user: "collectionUser",
pwd: "collectionPassword",
roles: [
{ role: "collectionRole", db: "testdb" }
]
})
EOF
这个脚本展示了如何在 MongoDB 中设置数据库级别和集合级别的访问控制,确保用户只能访问和操作他们被授权的数据库和集合。