mirror of
https://github.com/iflytek/skillhub.git
synced 2026-08-27 11:14:59 +00:00
5.2 KiB
5.2 KiB
认证扩展与私有 SSO 兼容设计
1. 目标
在不影响当前开源版 OAuth 和本地账号登录能力的前提下,为未来私有仓库接入企业 SSO 预留稳定扩展点,并把代码差异控制在 provider 实现层和少量配置层。
2. 已确认约束
- 私有 SSO 能提供稳定唯一 UID
- 用户名密码校验与 Cookie 会话校验都会返回同一稳定 UID
- 生产部署预期为
skill.xxx.com与sso.xxx.com - 私有版可通过后端内部接口/RPC 代调用 SSO 校验用户名密码
- 首次 SSO 登录自动创建 skillhub 账号
- 不做账号合并设计,不依赖 email
- 登出联动可保留扩展点,但不是近期目标
3. 开源版兼容策略
3.1 不改变现有主链路
- 现有 OAuth 登录流程保持不变
- 现有本地用户名密码登录保持不变
- 现有
/api/v1/auth/providers协议保持不变 - 不在开源版中引入私有 SSO 的真实实现
3.2 新增的公共扩展协议
开源版新增显式被动会话引导接口:
POST /api/v1/auth/session/bootstrap
请求:
{
"provider": "private-sso"
}
行为约束:
- 默认关闭,由
skillhub.auth.session-bootstrap.enabled=false控制 - 关闭时返回
403 - provider 不存在时返回
400 - 外部会话校验失败时返回
401 - 成功时建立 skillhub Session,并返回当前用户信息
同时新增默认关闭的直连认证兼容接口:
POST /api/v1/auth/direct/login
请求:
{
"provider": "private-sso",
"username": "alice",
"password": "secret"
}
行为约束:
- 默认关闭,由
skillhub.auth.direct.enabled=false控制 - 关闭时返回
403 - provider 不存在时返回
400 - 成功时建立 skillhub Session,并返回当前用户信息
- 开源版仍保留原始
/api/v1/auth/local/login
3.3 代码级扩展点
public interface PassiveSessionAuthenticator {
String providerCode();
Optional<PlatformPrincipal> authenticate(HttpServletRequest request);
}
public interface DirectAuthProvider {
String providerCode();
PlatformPrincipal authenticate(DirectAuthRequest request);
}
私有版只需要新增实现,例如:
private-sso-cookie:读取共享 Cookie 并向 SSO 校验- 后续如果需要,也可以补“用户名密码直连认证 provider”扩展点
为减少私有 fork 的前端硬编码,扩展 provider 可额外声明展示名称:
DirectAuthProvider.displayName()默认回退为providerCode()PassiveSessionAuthenticator.displayName()默认回退为providerCode()GET /api/v1/auth/methods会返回该展示名称,供登录页直接渲染
4. 本轮已落地内容
- 新增
PassiveSessionAuthenticatorSPI - 新增
DirectAuthProviderSPI - 新增统一会话建立服务
PlatformSessionService - 新增
POST /api/v1/auth/session/bootstrap协议 - 新增
POST /api/v1/auth/direct/login协议 - 新增
skillhub.auth.direct.enabled开关,默认关闭 - 新增
skillhub.auth.session-bootstrap.enabled开关,默认关闭 - 前端新增基于运行时配置的账号密码兼容接入层
- 前端新增基于运行时配置的被动会话兼容入口
- 前端新增显式按钮和可选自动尝试逻辑,默认都不启用
- 增加 controller 集成测试,验证:
- 默认关闭时不会影响现有系统
- 启用并提供 authenticator 时可以建立 skillhub Session
统一会话建立约束:
- 本地登录、OAuth 成功回调、direct auth、session bootstrap、mock 登录旁路都走
PlatformSessionService - 会话写入统一依赖
HttpSession属性:platformPrincipal与SPRING_SECURITY_CONTEXT - 因此在生产环境启用 Spring Session Redis 时,不需要为不同登录方式分别处理 Session 序列化或存储逻辑
- 交互式登录默认轮换 session id;OAuth 这类已在 Spring Security 认证链中的流程复用现有
Authentication
前端运行时配置:
SKILLHUB_WEB_AUTH_DIRECT_ENABLEDSKILLHUB_WEB_AUTH_DIRECT_PROVIDERSKILLHUB_WEB_AUTH_SESSION_BOOTSTRAP_ENABLEDSKILLHUB_WEB_AUTH_SESSION_BOOTSTRAP_PROVIDERSKILLHUB_WEB_AUTH_SESSION_BOOTSTRAP_AUTO
使用方式:
- 若要做密码直连,后端启用
skillhub.auth.direct.enabled=true - 私有版提供
DirectAuthProvider实现 - 前端设置
SKILLHUB_WEB_AUTH_DIRECT_* - 若要做被动会话,后端启用
skillhub.auth.session-bootstrap.enabled=true - 私有版提供
PassiveSessionAuthenticator实现 - 前端设置 bootstrap provider 和开关
- 登录页显示兼容入口,或在配置允许时自动尝试一次 bootstrap
5. 后续建议
- 私有版实现
DirectAuthProvider和 / 或PassiveSessionAuthenticator时,只扩展 provider 层,不复制 session 建立逻辑 - 私有版优先采用显式 bootstrap,而不是透明全局拦截器自动登录
- 如后续需要登出联动,只通过
LogoutPropagationHandler扩展,不改动现有主登出链路
6. 实施手册
更详细的私有 SSO 接入步骤、最佳实践、测试矩阵和给后续 coding agent 的执行约束,见: