ASP.NET Core 6应用多权限MongoDB数据库Schema设计咨询
MongoDB Schema设计方案(多环境多工作区权限场景)
核心集合设计
1. Users 集合
存储用户基础信息,避免冗余:
{ "_id": ObjectId("用户唯一ID"), "username": "zhangsan", "email": "zhangsan@example.com", "passwordHash": "xxx", "createdAt": ISODate("2024-01-01T00:00:00Z") }
2. Environments 集合
维护工作环境及环境内的用户角色,这是所有权限的基础:
{ "_id": ObjectId("环境唯一ID"), "name": "生产运营环境", "description": "公司核心业务运营环境", "members": [ { "userId": ObjectId("用户ID"), "role": "Admin" // 可选值:Admin/Worker }, { "userId": ObjectId("用户ID"), "role": "Worker" } ], "createdAt": ISODate("2024-01-01T00:00:00Z") }
3. Workspaces 集合
关联所属环境,同时区分Public/Private权限:
{ "_id": ObjectId("工作区唯一ID"), "name": "销售数据看板", "description": "月度销售数据分析工作区", "environmentId": ObjectId("所属环境ID"), "type": "Private", // 可选值:Public/Private "creatorId": ObjectId("创建者Admin的用户ID"), // 仅Private类型工作区需要该字段 "authorizedUsers": [ ObjectId("授权用户ID1"), ObjectId("授权用户ID2") ], "createdAt": ISODate("2024-01-01T00:00:00Z") }
权限验证逻辑
- 环境准入校验:用户访问任何工作区前,必须先确认自己是该工作区对应环境的成员(在
Environments的members列表中存在)。 - 工作区访问校验:
- 若为
Public工作区:只要用户是所属环境的成员(不管是Admin还是Worker),直接允许访问。 - 若为
Private工作区:需满足两个条件之一:- 是该工作区的创建者(
creatorId匹配用户ID); - 在
authorizedUsers列表中,且是所属环境的成员。
- 是该工作区的创建者(
- 若为
对你原方案的评估
你之前考虑的两个关联集合(用户-工作区、用户-环境)方案是可行的,但可以根据场景选择更合适的设计:
- 如果你的场景中环境成员或工作区授权变更特别频繁,或者需要记录关联的变更历史,单独的关联集合更适合,比如:
UserEnvironment集合:{ userId, environmentId, role, createdAt }UserWorkspace集合:{ userId, workspaceId, authorizedAt }(仅用于Private工作区)
但这种方式会增加查询次数,比如验证Private工作区权限时,需要先查用户是否在对应环境,再查是否在工作区授权列表。
- 上面给出的嵌入式设计更符合MongoDB的特性,能减少查询次数,比如查用户所有可访问的环境,直接筛选
Environments中members包含该用户ID的文档;查可访问的工作区,先拿到用户所属环境ID,再筛选对应环境下的Public工作区+Private工作区中用户在authorizedUsers里的文档,效率更高。
内容的提问来源于stack exchange,提问作者Nono-Man
相关产品推荐
相关产品推荐

