切换主题
7. 接入业务登录并上线
你已经掌握“声明 → 后台 HTTP API → 前端方法 / 组件”的接入链路。接下来把教程中的本地替代实现换成现有业务能力,并完成正式环境验证。
1. 换成业务现有登录体系
移除本地 LocalIdentity 和浏览器令牌输入页。由业务登录系统验证 Bearer / Cookie,产生可信 Principal,再实现 ChatCredentialResolver:
java
@Bean
ChatCredentialResolver chatIdentity(UserCredentialProvider<String> users) {
return request -> {
var principal = request.getUserPrincipal();
if (principal == null) throw new PlatformException(401, "UNAUTHENTICATED", "Login required");
return users.credentialFor(principal.getName());
};
}kotlin
@Bean
fun chatIdentity(users: UserCredentialProvider<String>) = ChatCredentialResolver { request ->
val principal = request.userPrincipal
?: throw PlatformException(401, "UNAUTHENTICATED", "Login required")
users.credentialFor(principal.name)
}users 是业务实现的受控凭据映射,不是 SDK 自动创建用户的服务。可以使用底座配置的 OIDC Access Token,也可以在受控管理流程预登记 USER 凭据。普通聊天运行不持有平台管理员凭据、不自动发用户令牌。
Cookie 写请求同时接入 ChatRequestVerifier 与原 CSRF 体系,前端通过 authHeaders 提供对应头。租户和业务数据权限还需 PermissionProvider / 业务查询校验,详见身份、权限与可信上下文。
2. 改用生产发布策略
yaml
sparktide:
deployment:
mode: PRODUCTION
source: tutorial-service
auto-sync: falsesource 应使用你真实业务的稳定标识,清单 managedBy 同步保持一致;已发布的资源不能通过换 source 认领,教程应用建议与正式业务应用分开。
启动只注册 / 检查清单,不自动发布。受控发布程序读取 SparkTideRegistration.registrationReport(),预检后显式 release("发布原因");不向浏览器暴露该方法。检查依赖和版本冲突、默认入口切换与回退,见声明式注册与发布。
3. 部署业务后台和前端
底座用 PostgreSQL 持久化,业务回调配置可访问的 HTTPS 地址和独立密钥;前端生产网关转发 /api/ai 到业务后台,并支持 SSE 长连接。Vite 开发代理只在本机起作用。
前端执行 npm run build,交付生成的 dist。后台按原 Spring 工程打包部署;教程使用 Gradle application 便于运行,不是生产发布模板。详细配置从部署与运维进入。
4. 上线前确认实际行为
| 要检查的事 | 可观察结果 |
|---|---|
| 实际模型与身份服务 | 实网调用成功,登录续期和撤销有效 |
| 两用户、两租户 | 会话、业务工具和知识均不串数据 |
| 权限收回 | 历史、来源预览和新调用按当前权限拒绝 |
| 危险操作 | 批准 / 拒绝符合业务预期,重复请求不重复业务写入 |
| 断线、取消和重启 | 订阅恢复对应原 Run;取消明确,不把重试当成重新提交 |
| 发布与回退 | 生产重启不发布,精确版本可追溯,默认入口可回退 |
| 容量与运维 | 真实并发、模型限额、备份恢复和告警通过验证 |
本地构建或模型替身只能覆盖本地链路,不代替这张表的正式环境证据。
回滚
关闭 sparktide.chat.enabled 可停用新聊天入口,再回退业务部署 / SDK 版本。底座数据保留;配置通过显式发布和默认入口版本切换回退,不清空数据库或回调账本。
