文档权限机制说明
大约 4 分钟约 1094 字
文档权限机制说明
文档插件采用框架权限、菜单按钮权限和文档级业务权限共同控制访问。本文只描述当前实现,不保留早期规划中的旧假设。
权限层级
| 层级 | 作用 | 实现 |
|---|---|---|
| 登录和接口权限 | 控制用户是否能访问菜单、按钮和接口 | Admin.NET 菜单、按钮、接口权限 |
| 数据字段 | 保留创建人、创建部门等框架数据字段 | EntityBaseData |
| 文档级权限 | 控制单个文档的查看、下载、编辑、删除、分享 | DocumentPermission 表 |
Document 和 DocumentCategory 继承 EntityBaseData,但文档列表和详情查询中会显式处理文档业务权限,避免普通用户因框架数据范围看不到公共文档。
默认可见策略
当前实现采用以下策略:
- 文档创建者拥有该文档所有权限。
- 未设置任何
DocumentPermission记录的文档,默认所有登录用户可查看。 - 一旦文档设置了任意
DocumentPermission记录,该文档进入受控状态,非创建者必须匹配相应权限才能查看或操作。 - 下载、编辑、删除、分享不会因为默认公开而自动放开,非创建者需要对应权限。
这点和早期草稿中的“未设置权限时仅创建者可见”不同,以当前代码为准。
权限类型
DocumentPermissionTypeEnum:
| 值 | 名称 | 说明 |
|---|---|---|
1 | View | 查看详情、出现在列表、预览前置权限 |
2 | Download | 下载文件,列表中也据此决定是否返回文件 URL |
3 | Edit | 编辑文档信息 |
4 | Delete | 删除文档 |
5 | Share | 分享文档 |
授权对象类型:
| 值 | 对象 | 匹配方式 |
|---|---|---|
1 | 用户 | ObjectId == 当前用户ID |
2 | 部门 | ObjectId == 当前用户部门ID |
3 | 角色 | ObjectId 在当前用户角色 ID 列表中 |
列表和详情可见性
文档列表 /api/document/page 和搜索 /api/document/search 的核心可见规则:
创建者可见
或 文档未设置任何权限记录时默认可见
或 当前用户匹配 View 权限文档详情 /api/document/detail 也是同样策略:如果非创建者访问受控文档,必须拥有 View 权限。
操作权限
| 操作 | 创建者 | 未设置权限的文档 | 已设置权限的文档 |
|---|---|---|---|
| 查看 | 允许 | 登录用户允许 | 需要 View |
| 下载 | 允许 | 非创建者不自动允许 | 需要 Download |
| 编辑 | 允许 | 非创建者不自动允许 | 需要 Edit |
| 删除 | 允许 | 非创建者不自动允许 | 需要 Delete |
| 分享 | 批量分享接口当前要求创建者 | 非创建者不自动允许 | 视接口实现和 Share 权限扩展 |
设置权限
接口:
POST /api/document/permission/set请求示例:
{
"documentId": 123,
"permissions": [
{
"permissionType": 1,
"objectType": 1,
"objectIds": [1001]
},
{
"permissionType": 2,
"objectType": 3,
"objectIds": [2001, 2002]
}
]
}设置逻辑:
- 校验文档存在。
- 删除该文档旧权限。
- 按
permissionType + objectType + objectIds展开写入新权限。
如果传入空权限列表,会清空该文档权限记录。清空后该文档恢复为“默认可查看”策略。
分享权限
分享服务包含两类访问:
- 管理类接口需要登录,例如创建、批量创建、取消、删除、我的分享。
- 公开访问接口允许匿名访问,例如验证分享码、按分享码获取文档。
公开接口:
POST /api/document/share/verify
GET /api/document/share/document-by-code?shareCode={code}&password={password}分享支持:
- 分享码。
- 可选密码。
- 有效期天数,
0表示不过期。 - 访问次数。
- 分享权限字段
SharePermission,当前用于区分分享访问能力。
批量分享接口当前只允许文档创建者对自己的文档生成分享链接。
维护建议
- 若文档需要限制查看范围,至少设置一条
View权限。 - 若只设置
Download、Edit等权限但不设置View,用户可能拥有操作权限但无法在列表/详情中看到文档,建议权限配置时一并授予View。 - 权限管理页面只列出已设置权限的文档;未设置权限的公开文档不会出现在该页面。
- 权限变更是整量替换,前端提交前应先读当前权限列表再合并修改。
- 涉及下载、编辑、删除、分享的新增接口,应复用同一套“创建者优先 + 对应权限匹配”的规则。