MongoDB(74)什么是数据库级别和集合级别的访问控制?

数据库级别和集合级别的访问控制是 MongoDB 中控制用户权限和访问的两种主要方法。通过这些控制,管理员可以细粒度地管理用户对数据库和集合的访问权限,确保数据的安全性和操作的规范性。

数据库级别的访问控制

数据库级别的访问控制是指用户对整个数据库的权限控制。这种权限控制应用于数据库中的所有集合。

示例:数据库级别的访问控制

  1. 连接到 MongoDB 实例:

    bash 复制代码
    mongo
  2. 切换到 admin 数据库:

    javascript 复制代码
    use admin
  3. 创建数据库用户:

    切换到目标数据库,例如 testdb,然后创建一个具有读写权限的用户:

    javascript 复制代码
    use testdb
    
    db.createUser({
      user: "dbUser",
      pwd: "dbPassword",
      roles: [
        { role: "readWrite", db: "testdb" }
      ]
    })

    上述代码为 testdb 数据库创建了一个用户 dbUser,该用户具有读写权限。

  4. 验证数据库级别权限:

    使用新创建的用户连接到 MongoDB,并尝试对 testdb 数据库进行操作:

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

    在 MongoDB Shell 中:

    javascript 复制代码
    use testdb
    
    db.collection1.insert({ "key": "value" }) // 应该成功
    db.collection1.find()                     // 应该成功
    db.collection2.update({ "key": "value" }, { $set: { "key": "newValue" } }) // 应该成功

    用户 dbUsertestdb 数据库中具有对所有集合的读写权限。

集合级别的访问控制

集合级别的访问控制是指用户对特定集合的权限控制。这种权限控制应用于指定集合,而不影响数据库中的其他集合。

示例:集合级别的访问控制

  1. 连接到 MongoDB 实例:

    bash 复制代码
    mongo
  2. 切换到 admin 数据库:

    javascript 复制代码
    use admin
  3. 创建自定义角色:

    创建一个自定义角色,该角色具有对 testdb 数据库中某些集合的特定权限:

    javascript 复制代码
    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 集合的 findinsert 操作权限。
    • testdb 数据库中 collection2 集合的 updateremove 操作权限。
  4. 创建用户并赋予集合级别权限:

    切换到目标数据库 testdb,然后创建一个用户并赋予自定义角色:

    javascript 复制代码
    use testdb
    
    db.createUser({
      user: "collectionUser",
      pwd: "collectionPassword",
      roles: [
        { role: "collectionRole", db: "testdb" }
      ]
    })
  5. 验证集合级别权限:

    使用新创建的用户连接到 MongoDB,并尝试对 testdb 数据库中的指定集合进行操作:

    bash 复制代码
    mongo -u "collectionUser" -p "collectionPassword" --authenticationDatabase "testdb"

    在 MongoDB Shell 中:

    javascript 复制代码
    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 仅对 collection1collection2 集合具有特定的操作权限,而其他集合则没有权限。

总结

通过数据库级别和集合级别的访问控制,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" 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 中设置数据库级别和集合级别的访问控制,确保用户只能访问和操作他们被授权的数据库和集合。

相关推荐
折哥的程序人生 · 物流技术专研16 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试
Moment17 小时前
面试官:如果产品经理给你多个需求,怎么让AI去完成❓❓❓
前端·后端·面试
每天进步一点_JL18 小时前
JVM 内存模型与 OOM 排查:从入门到实战
后端
REDcker18 小时前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站
Supersist18 小时前
【设计模式03】使用模版模式+责任链模式优化实战
后端·设计模式·代码规范
Fox爱分享19 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试
折哥的程序人生 · 物流技术专研19 小时前
《Java面试85题图解版(二)》进阶深化上篇:并发编程 + JVM
java·开发语言·后端·面试
Mahir0819 小时前
MySQL 数据一致性的基石:三大日志( redo log/undo log/binlog)与两阶段提交(Prepare 阶段和Commit 阶段)深度解密
数据库·后端·mysql·面试
L0CK19 小时前
Redis 内存淘汰策略
后端
zhengzizhe19 小时前
ReBAC 与 Google Zanzibar:权限系统的未来
后端·架构