cxl
Published on 2025-05-13 / 15 Visits
0
0

MongoDB之角色与权限

在数据库管理中,角色和权限管理是保障数据安全的重要环节。MongoDB 作为一款强大的非关系型数据库,提供了灵活且细致的角色和权限管理机制。本文将通过详细的 SQL 语句操作示例,带大家了解一下 MongoDB 中角色和权限的相关操作。

一、MongoDB 角色概述

MongoDB 内置了多种角色,这些角色预定义了不同的权限集合,大致可分为以下几类:

  • 数据库用户角色:如read、readWrite,用于控制对单个数据库的读写权限。

  • 数据库管理角色:例如dbAdmin、dbOwner,赋予对数据库进行管理操作的权限,像创建集合、索引等。

  • 集群管理角色:包括clusterAdmin、clusterManager,用于管理整个 MongoDB 集群,比如查看集群状态、配置分片等。

  • 超级用户角色:root角色拥有最高权限,可对所有数据库进行任何操作。

除了内置角色,MongoDB 还支持创建自定义角色,满足特定业务场景下的权限需求。

二、用户创建与权限分配

1. 创建用户并分配角色

在 MongoDB 中,使用 db.createUser() 方法创建用户,并为其分配角色。假设我们要在test数据库中创建一个名为user1,密码为password1,拥有readWrite权限的用户,操作如下:

  use test;
  db.createUser(
   { 
    user: "user1",
    pwd: "password1",
    roles: [ { role: "readWrite", db: "test" } ] 
   }
  );

上述语句中,use test切换到test数据库,db.createUser()方法接收一个包含用户信息和角色信息的文档。user字段指定用户名,pwd字段设置密码,roles数组用于指定角色,role字段指定角色名称,db字段指定该角色作用的数据库。

如果要为用户分配多个角色,只需在roles数组中添加多个角色文档即可。例如,为user1再分配dbAdmin角色:

  use test; 
  db.grantRolesToUser("user1", [
    {role: "dbAdmin", db: "test"}
  ])

这里使用db.grantRolesToUser()方法,将dbAdmin角色添加到user1的角色列表中。

2. 查看用户权限

可以使用db.getUser()方法查看指定用户的详细信息,包括其拥有的角色:

  use test;
  db.getUser("user1");

执行上述语句后,会返回user1用户的详细信息,其中包含其拥有的readWrite和dbAdmin角色。

此外,也可以使用db.getUsers()方法查看当前数据库下的所有用户及其角色信息:

  use test;
  db.getUsers();

三、自定义角色创建与使用

当内置角色无法满足业务需求时,我们可以创建自定义角色。例如,创建一个名为customRole的角色,该角色只允许对test数据库中的products集合进行读取操作:

  use test;
  db.createRole(
   {
     role: "cxlRole",
     privileges: [
       {
         resource: { db: "test", collection: "products" },
         actions: [ "find" ]
       }
     ],
     roles: []
   }
  );

在db.createRole()方法中,role字段指定角色名称,privileges数组定义了该角色拥有的权限,resource对象指定权限作用的数据库和集合,actions数组列出了允许执行的操作。这里只允许执行find操作,即查询。roles数组用于指定该角色继承的其他角色,由于此为全新自定义角色,暂时不继承其他角色,所以设为空数组。

创建好自定义角色后,我们可以将其分配给用户。例如,创建一个名为user2,拥有customRole角色的用户:

  use test;
  db.createUser(
   {
     user: "user2",
     pwd: "password2",
     roles: [ { role: "cxlRole", db: "test" } ]
   }
  );

四、权限修改与用户删除

1. 修改用户权限

如果需要修改用户的权限,比如要从user1中移除dbAdmin角色,可以使用db.revokeRolesFromUser()方法:

  use test;
  db.revokeRolesFromUser("user1", [
    {role: "dbAdmin", db: "test"}
  ])  

2. 删除用户

当某个用户不再需要时,可以使用db.dropUser()方法将其删除。例如,删除user2用户:

  use test;
  db.dropUser("user2");

执行该语句后,user2用户及其相关权限将被彻底删除。

五、角色列表

1. 数据库用户角色(作用于单个数据库)

角色

权限描述

read

- 只读非系统集合及 system.js

- 支持 findlistCollectionsdbStats 等查询操作

- 无法访问 system.namespaces

readWrite

- 包含 read 所有权限
- 新增数据修改(insertupdateremove
- 支持创建集合、索引、搜索索引(createCollectioncreateIndex 等)

2. 数据库管理角色(作用于单个数据库)

角色

权限描述

dbAdmin

- 架构管理:createCollectioncollModdropCollection
- 索引管理:createIndexdropIndex
- 统计优化:dbStatscompactvalidate
- 系统集合操作:对 system.profile 执行 findchangeStream

dbOwner

- 组合 readWritedbAdminuserAdmin 权限
- 数据库完全控制(读写、管理、用户权限)

userAdmin

- 用户 / 角色管理:createUserdropUsercreateRolegrantRole
- 密码修改:changePassword
- 作用于 admin 数据库时可间接获取集群超级权限

3. 集群管理角色(作用于 admin 数据库,集群级操作)

角色

权限描述

clusterAdmin

- 最高集群权限,包含 clusterManagerclusterMonitorhostManager 权限
- 分片 / 复制管理:addShardreplSetConfigure
- 支持 dropDatabase

clusterManager

- 分片与复制管理:addShardremoveShardreplSetGetConfig
- 访问 config(分片元数据)和 local(复制数据)数据库(读写)

clusterMonitor

- 只读监控:serverStatuslistDatabasesreplSetGetStatus
- 系统集合统计:collStatsindexStats

hostManager

- 服务器管理:shutdownlogRotatesetParameter
- 连接池管理:connPoolSynckillAnyCursor

4. 备份与恢复角色(作用于 admin 数据库)

角色

权限描述

backup

- 备份最低权限:支持 mongodump
- 读取非系统集合及 system.profile
- 配置操作:config.settings 集合 insert/update

restore

- 数据恢复:支持 mongorestore(非系统集合写入)
- 特殊场景:恢复 system.profilecreateCollection 权限
- --oplogReplay 需自定义角色

5. 全数据库角色(作用于 admin 数据库,跨数据库操作)

角色

权限描述

readAnyDatabase

- 跨数据库只读,等同 read 角色
- 支持集群级 listDatabases

readWriteAnyDatabase

- 跨数据库读写,等同 readWrite 角色
- 支持数据压缩(compactStructuredEncryptionData

userAdminAnyDatabase

- 跨数据库用户管理:创建 / 修改其他数据库用户
- 超级用户权限,可自授权所有特权

dbAdminAnyDatabase

- 跨数据库管理,等同 dbAdmin 角色
- 支持集群级 listDatabases

6. 超级用户角色

角色

权限描述

root

- 组合所有全数据库、集群管理、备份恢复角色权限
- 特殊权限:忽略查询超时(bypassDefaultMaxTimeMS)、访问 config.system.preimages

__system

- 内部角色,节点对所有资源完全控制
- 不建议分配给普通用户

7. 关键说明

  1. 权限作用域

    • admin 角色仅作用于当前数据库,admin 角色可跨数据库或集群生效。

  2. 动态查询

    • 使用 rolesInfo({showPrivileges: true, showBuiltinRoles: true}) 命令实时查看权限细节。

  3. 安全提示

    • 高权限角色(如 userAdminAnyDatabaseroot)需严格控制分配,避免权限滥用。

六、总结

通过以上内容,我们详细学习了 MongoDB 中角色和权限相关的 SQL 语句操作,包括用户创建与权限分配、自定义角色创建、权限修改以及用户删除等操作。合理运用这些操作,能够构建起安全、灵活的数据库权限管理体系,有效保障数据的安全性和完整性。在实际应用中,需根据业务需求谨慎规划角色和权限,避免出现权限过度或不足的情况。1


Comment