其他
需要在 Caffeine AI…
在 Caffeine AI/Motoko 应用里,让用户申请访问、管理员批准或拒绝,并保护功能只对已批准用户开放。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 40/100 ×0.15
适用场景
需要在 Caffeine AI 应用中做特定
解决思路
- 使用预制模块 `mo:caffeineai-user-approval/approval` 做底层审批状态管理,并且不要修改该模块。
- 使用该模块的类型:`ApprovalStatus`(`#approved`、`#rejected`、`#pending`)、`UserApprovalState`、`UserApprovalInfo`(`{ principal : Principal; status : ApprovalStatus; }`)。
- 使用该模块的函数:`initState(accessControlState)`、`isApproved(state, caller)`、`requestApproval(state, caller)`、`setApproval(state, user, approval)`、`listApprovals(state)`。
- 在 `main.mo` 中导入 `AccessControl`(`mo:caffeineai-authorization/access-control`)、`MixinAuthorization`(`mo:caffeineai-authorization/MixinAuthorization`)、`MixinUserApproval`(`mo:caffeineai-user-approval/MixinUserApproval`)、`UserApproval`(`mo:caffeineai-user-approval/approval`)、`Runtime`(`mo:core/Runtime`)。
- 在 actor 顶层声明 `accessControlState : AccessControl.AccessControlState;`,并 `include MixinAuthorization(accessControlState, null);`。
- 在 actor 顶层声明 `approvalState : UserApproval.UserApprovalState;`,并 `include MixinUserApproval(accessControlState, approvalState);`。
- 将 `include MixinUserApproval(accessControlState, approvalState)` 放在 `main.mo` 中,不要放在自定义 mixin 文件。
- 依赖该 mixin 自动提供公开端点:`isCallerApproved()`、`requestApproval()`、`setApproval(user, status)`、`listApprovals()`。
- 不要重新声明任何 mixin 提供的函数。
- 保持 `approvalState` 在作用域中,以便在应用自定义端点中编写审批守卫。
- 对每个自定义 public 函数应用正确的 authorization 和/或 approval 检查;例如在受保护端点中检查 `UserApproval.isApproved(approvalState, caller) or AccessControl.hasPermission(accessControlState, caller, #admin)`,不满足则执行 `Runtime.trap("Unauthorized: Only approved users can perform this action")`。
- 在迁移链头部,因 `UserApproval.initState` 依赖 access-control state,需要在 migration body 中按顺序计算:先 `let accessControlState = AccessControl.initState();`,再 `approvalState = UserApproval.initState(accessControlState);`。
- 在 migration 文件中导入 `AccessControl`(`mo:caffeineai-authorization/access-control`)和 `UserApproval`(`mo:caffeineai-user-approval/approval`),定义 `type NewActor = { accessControlState : AccessControl.AccessControlState; approvalState : UserApproval.UserApprovalState; };`,并实现 `public func migration(_old : {}) : NewActor { ... }` 返回这两个状态。
- 利用 `initState` 行为初始化:现有 admins 自动 approved,所有其他用户为 pending。
- 前端审批流程:调用 `isCallerApproved` 检查审批状态。
- 前端若未批准,显示请求审批选项,并调用 `requestApproval`。
- 前端阻止未批准用户访问主要功能。
- 前端允许管理员访问应用所有功能。
- 前端在 UI 中清晰显示审批状态。
- 为管理员提供仪表盘。
- 在管理员仪表盘中用 `listApprovals` 列出所有用户及其审批状态。
- 在管理员仪表盘中用 `setApproval` 批准或拒绝用户。
- 在管理员仪表盘中用 `getCallerUserRole` 和 `assignCallerUserRole` 查看并分配用户角色。
- 后端集成时使用已实现接口:`isCallerApproved(): Promise<boolean>;`(管理员始终 approved)、`requestApproval(): Promise<void>;`、`listApprovals(): Promise<Array<UserApprovalInfo>>;`(仅管理员)、`setApproval(user: Principal, status: ApprovalStatus): Promise<void>;`(仅管理员)、`assignCallerUserRole(user: Principal, role: UserRole): Promise<void>;`(仅管理员)、`getCallerUserRole(): Promise<UserRole>;`。
- 在 `<backend-interface>` 查看完整接口。
适用边界 · 注意事项
- 未先按 extension-authorization 完成授权集成时不要使用;该集成依赖它。
- 应用不使用 Caffeine AI/Motoko,或无法引入 `mo:caffeineai-user-approval/approval`、`mo:caffeineai-authorization/access-control` 等预制模块时不适用。
- 不需要基于审批的访问控制(例如完全开放注册或已有其他用户访问方案)时不适用。