受限事项与原操作闭环
账号恢复、权利申请和人工审批适合使用显式业务命令:tio-boot-admin 提供数据库生命周期与后台登录能力,业务服务负责当前对象范围、状态版本和用途。这样可以复用框架基础设施,同时把每一次业务变更限定到可解释的动作。
选择注册入口
下面配置复用框架数据库与账号登录处理器。项目自己的事项处理器按具体 HTTP 方法和路径逐一注册,完整业务授权留在服务层。
import nexus.io.context.BootConfiguration;
import nexus.io.tio.boot.admin.config.TioAdminDbConfiguration;
import nexus.io.tio.boot.admin.handler.AdminLoginHandler;
import nexus.io.tio.boot.server.TioBootServer;
import nexus.io.tio.http.common.HttpMethod;
import nexus.io.tio.http.server.router.HttpRequestRouter;
public class ScopedAdminConfiguration implements BootConfiguration {
@Override
public void config() {
new TioAdminDbConfiguration().config();
HttpRequestRouter router = TioBootServer.me().getRequestRouter();
if (router == null) {
throw new IllegalStateException("HTTP router is required");
}
router.add(HttpMethod.POST, "/api/login/account", new AdminLoginHandler()::account);
// 在此继续注册项目自己的查询、补件、批准和执行处理器。
}
}
通用表接口适合经过授权的后台数据管理;具备双人审批、限定证明或状态机的事项,应通过服务命令更新。前端按钮是否显示仅影响体验,服务端始终复核真实会话、自然人映射与对象范围。
区分三种凭证
| 凭证 | 允许范围 | 不可推导的权限 |
|---|---|---|
| 普通账号会话 | 本人资料、本人会话、本人事项 | 后台审核权限 |
| 单事项限定证明 | 指定事项的查询和必要补件 | 完整账号访问、其他事项 |
| 后台会话 | 当前具名自然人及有效授权范围 | 任意数据访问或永久授权 |
限定证明使用高熵随机值,服务端保存摘要和明确的对象、用途、到期时间。不能把公开编号当作访问凭证,也不能把手机号验证当作实名资格。敏感正文单独加密保存,普通进度接口与审计只返回必要引用。需要查看正文时,另设材料读取授权并记录访问事件。
读取策略统一使用 EnvUtils,业务 ID 使用雪花 ID,返回浏览器时转换成字符串,避免 JavaScript 整数精度丢失:
import nexus.io.tio.utils.environment.EnvUtils;
import nexus.io.tio.utils.snowflake.SnowflakeIdUtils;
public final class CasePolicy {
public static int proofSeconds() {
int seconds = EnvUtils.getInt("identity.case.proof.seconds", 0);
if (seconds <= 0) {
throw new IllegalStateException("Case proof policy is required");
}
return seconds;
}
public static String newCaseId() {
return Long.toString(SnowflakeIdUtils.id());
}
}
普通会话、手机号短证明、事项证明和审批许可分别配置有效期。候选数值不能通过代码默认值直接变成线上业务规则。
原操作与领域结果一起提交
客户端首次提交前保存操作标识,服务器以“主体+命令+操作标识”建立唯一约束,同时保存请求摘要。相同标识、相同内容返回原结果;相同标识、不同内容返回明确冲突。领域事实与结果引用在同一数据库事务中提交,跨进程竞争由数据库锁和唯一约束处理。
断网或提交响应丢失时,页面先进入结果待核状态,再按原操作标识查询。不能从“事项现在处于审核中”推断某一次补件成功,也不能换新标识自动提交。查询仍须核验当前会话或限定证明;幂等性不会恢复已经失效的权限。
使用 java-db 事务能使领域更新、操作记录和审计引用共享连接。业务异常回滚后保留原异常类型,接口层能够将明确拒绝与未知结果分别表达。完整事务用法见 java-db 静态 Db、JSONB 与事务。
双人批准与实际执行分别建模
提议绑定对象版本、动作摘要、指定执行人和失效时间。批准时比较自然人标识,两个后台账号属于同一个自然人仍不能组成双人审批。执行前重新读取批准人的有效授权、指定执行人、利益冲突、对象版本和审批有效期。
批准不代表已执行;执行需要唯一执行记录。版本或授权发生变化后,应重新获得批准。日志只记录对象与事件引用,不记录密码、密码摘要、完整令牌或材料正文。
通知与期限分离
生成、投递、打开、标记已读、首次合法可见分别记录。补件说明在有效授权下、页面处于前台且进入视口后,才发送可见证据。服务端按补件轮次只写入一次起算时间;重读、其他端同步和标记已读不能延长期限。前端的可见证据必须通过服务端事项授权核验,不能只信任客户端提供的对象编号。
材料保留策略按用途落实到到期时间。到期清理保留事项结果与最小审计引用;存在有效保留条件时暂缓正文清理。清理任务独立运行,不把“正文已清理”表达成“账号恢复完成”或“所有责任消失”。
验证建议
用独立数据库 schema 验证并发重试、跨事项证明拒绝、同自然人审批拒绝、批准后撤权、执行版本变化、期限首次起算、材料清理和敏感日志最小化。先通过服务层集成测试,再用真实 HTTP 验证路由与鉴权,最后通过浏览器核验前台可见与窄屏只读。小程序构建成功与微信真机体验分别保留证据。
