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" } }) // 应该成功

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

集合级别的访问控制

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

示例:集合级别的访问控制
  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 集合的 find 和 insert 操作权限。
    • 对 testdb 数据库中 collection2 集合的 update 和 remove 操作权限。
  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 仅对 collection1 和 collection2 集合具有特定的操作权限,而其他集合则没有权限。

总结

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

相关推荐
不脱发的程序猿7 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节
程序员塔塔喵8 小时前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
北京青蓝智慧马老师8 小时前
比外部黑客更难防的,是那个有权限的自己人(3 个脱敏复盘)
大数据·数据库·人工智能
笃行3509 小时前
拆一台数据集成产品:KFS 的骨架、肌肉和神经
数据库
4SAPI9 小时前
搭建 AI 数据分析工具大模型 API 选型指南
数据库·人工智能·架构·php·1024程序员节
码士集团小青10 小时前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节
LMT流氓兔11 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
cuijiecheng201811 小时前
WeFlow 无法使用怎么办?一次数据库组件到期问题的排查与修复
数据库·oracle
一条泥憨鱼12 小时前
【Redis | 黑马点评】附近商铺功能源码解读
数据库·redis·缓存
念何架构之路13 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang