拆分顺序:数据协议 → Codec → Service/认证 → UI/验证 每个任务完成后同步回填 Spec、Test Spec 和执行日志
VITE_APP_SECRET,不输出其值。forge-server/db/migration/V1.0.53__harden_client_credentials.sqlforge-server/db/全量初始化SQL.sqlforge-server/forge-admin-server/sql/初始化脚本.sql.../entity/SysClient.java.../dto/SysClientDTO.java、.../vo/SysClientVO.javaclientAuthMethod、hasAppSecret。app_secret 为空;受管 SQL 不含已知弱值。{bcrypt} 摘要,查询与条件升级落在 Mapper XML。.../security/ClientSecretCodec.java.../mapper/SysClientMapper.java.../resources/mapper/SysClientMapper.xml.../service/IClientService.java.../service/impl/ClientServiceImpl.javajava
SysClient createClient(SysClientDTO dto);
boolean updateClient(SysClientDTO dto);
boolean validateAppSecret(SysClient client, String rawSecret);
int countLegacyPlaintextSecrets();
.../service/impl/SystemAuthServiceImpl.java.../controller/SysClientController.java.../service/IClientService.java.../service/impl/ClientServiceImpl.javaforge-admin-ui/.env.development、.env.production、.env.exampleforge-admin-ui/src/views/login/index.vueforge-admin-ui/src/views/login/callback.vueforge-admin-ui/src/views/system/client.vuegit diff --check 通过。.env* 不声明或暗示浏览器客户端 Secret;Mapper、管理响应和日志边界具备合同测试。app_secret;轮换、清空和认证方式切换必须使用旧值 CAS。/auth/online/** 强制登录并逐接口授权,管理操作先校验租户内会话或用户;删除匿名 /test。userTokens 兼容路径不返回 Token,分页/列表 SQL 不读取 Token 列。V1.0.53、V1.0.56 并核对资源权限和存量客户端盘点。