身份、角色与表单访问
管理系统身份、受访者身份和明确表单访问规则,不把授权当作客户端功能。
表单访问控制与游标分页开发指南
Form Access 是表单级 ACL。它把匿名、拒绝、可读、可编辑和删除权限写入 `app_form_access_rules`,并按用户和角色组合计算。拒绝规则优先级最高;Administrator 保留全局恢复权限。问卷受访者访问仍由部署、清单、时间范围和 respondent 身份链控制,不应以普通系统用户 ACL 取代。
权限模型
| 权限 | 用途 |
|---|---|
| Anonymous | 可不登录使用 Form Viewer。匿名表单不能单独配置拒绝/可读主体。 |
| Deny | 明确禁止用户或角色访问,优先于其它允许规则。 |
| Read | 可通过 Viewer 打开表单。 |
| Edit | 可通过 Designer 修改表单定义。 |
| Delete | 可从 Form Center 删除表单。 |
| Create | 控制谁可建立新表单;这是全局规则,不属于单个表单。 |
系统默认角色规则:Administrator 可读、编辑、删除和代填;FormDesigner 可编辑系统/功能表单并按问卷规则可读;SurveyAssistant 可代填问卷但不能设计。实际管理员可在 Form Access 系统表单中增加或移除额外的用户/角色规则。
高性能 Form Center
Form Center 不读取全部表单再在浏览器过滤。服务器将 `form_type`、`is_anonymous` 等元数据同步为可索引列,先在数据库获得 ACL 候选表单 ID,再采用 `(updated_at, id)` 游标分页读取一个候选窗口。服务器为当前用户计算 `canRead`、`canEdit`、`canDelete`;客户端只负责显示对应按钮或卡片。
游标保存上一页最后一条的排序键和 ID。即使该记录随后被删除,下一页仍按“严格小于/大于该键”的条件继续,不会损坏分页;个别记录可能因并发更新跨页移动,这是游标分页相对于大 OFFSET 的正常一致性取舍。
开发要求
新的表单 API 必须在服务端调用现有 ACL 服务;不可只隐藏客户端按钮。返回给客户端的权限能力应是稳定字段,不应把角色列表、拒绝策略或其它安全细节暴露为浏览器可修改的状态。新增媒体、商城或模块系统表单时,明确其 Form Access 初始规则和 Administrator 恢复路径。
English edition: FORM_ACCESS_CONTROL_DEVELOPER_GUIDE.md.