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

相关推荐
写后端的胖头鱼2 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
路远的数据库笔记2 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰2 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
kaiyou20262 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习
mjhcsp3 小时前
DeepSeek V4.1 Flash 批量处理效能实测
java·前端·数据库
ShineWinsu3 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
lie..3 小时前
30天从零开始学AI应用开发(Day 17):ChromaDB 上手:给本地文档建一个“外挂大脑”
数据库·人工智能·oracle
code_whiter4 小时前
01-MySQL数据库基础
数据库·mysql
weixin_382395234 小时前
本地部署 ERP 选型记录:从 Excel 到轻量系统的这几年
数据库·人工智能·数据挖掘
2401_891409264 小时前
期货量化用得上的几类行情数据:逐笔、Level2、分钟线和五档tick
数据库