接入 AD 第一因素与 React 登录页面,由 Spring Security 管理认证 #4

Merged
panxiao81 merged 9 commits from feat/ad-login into main 2026-09-27 17:59:37 +00:00
Owner

问题与结果

为独立 iam-login 接入 Samba AD 第一因素与真实浏览器登录页面。React + Vite 只替换 Spring Security 默认 UI:Spring 返回带上下文的 HTML,浏览器原生表单 POST 交给 formLogin,不引入 SPA 路由、fetch 登录流程、模板引擎或 Node 运行服务。

Spring Security 负责表单认证、因素状态、SecurityContext、会话轮换与退出。DirectoryAuthenticationProvider 调用目录用例,Spring Data LDAP 用户仓储复用本次用户 bind 连接查询账号、objectGUID 与直接 memberOf,查询完成即关闭,不新增读取账号,不将密码或连接保存到 session。

领域层保留 User/UserRepository,应用层编排目录认证和读取。没有自建 LoginTransaction 或并行浏览器认证状态机,也不保留选型 preview 功能。AD 组保持原样,不展开嵌套组或主组,不映射为本服务权限。

密码成功仅保存 FACTOR_PASSWORD,待 MFA 页面要求十分钟内的密码因素;其他应用入口暂时 denyAll,尚未接入 MFA 或 Hydra challenge。监控 Basic 认证使用独立无状态安全链。

验证

  • 最终代码 8b6d18f:18 项 JVM 测试、前端构建和 bootJar 通过。
  • 覆盖同连接 LDAP 查询、因素保存和过期、会话轮换、HTTPS、CSRF、退出及监控与人类认证隔离。
  • 更新后的 Tailscale HTTPS 开发实例通过 1 项浏览器回归:原生 POST、失败清空密码、无 fetch/XHR、移动端布局。
  • 早期 AD 路径曾通过维护者真实账号验收;最终 Spring Security 版本真实人类复验待反馈,不以夹具或合成用户名回归替代。
  • 本轮未执行 Native 编译或原生认证测试;Native 仍是交付约束,留待阶段性验收。条件装配在 AOT 构建时确定,AD Native 构建须启用 iam.ad.enabled;此限制及验收项已写入 docs/native-validation.md。

Review 处理

  • 已删除 SignInAvailabilityFilter:使用 redirectToHttps;仅在 iam.ad.enabled=true 时装配登录 Controller 和 formLogin,未启用时由兜底链拒绝。测试确认 HTTP 跳转前不执行密码 bind 或退出。

部署与文档

默认关闭 AD,启用时使用受信 LDAPS CA 与 HTTPS。仅更新已有 Tailscale 开发入口,生产 Go/Authelia/Gitea 链路未切换。生产入口限流、审计、MFA 与 Hydra 集成仍待实现。

使用说明见 docs/ad-login.md;Wiki 设计与边界直接维护于 main。

本 PR 直接针对 main,统一包含原 #3、#4、#5 的最终代码;#3、#5 由本 PR 替代。代码持续更新于此 PR,未合并到 main。

## 问题与结果 为独立 iam-login 接入 Samba AD 第一因素与真实浏览器登录页面。React + Vite 只替换 Spring Security 默认 UI:Spring 返回带上下文的 HTML,浏览器原生表单 POST 交给 formLogin,不引入 SPA 路由、fetch 登录流程、模板引擎或 Node 运行服务。 Spring Security 负责表单认证、因素状态、SecurityContext、会话轮换与退出。DirectoryAuthenticationProvider 调用目录用例,Spring Data LDAP 用户仓储复用本次用户 bind 连接查询账号、objectGUID 与直接 memberOf,查询完成即关闭,不新增读取账号,不将密码或连接保存到 session。 领域层保留 User/UserRepository,应用层编排目录认证和读取。没有自建 LoginTransaction 或并行浏览器认证状态机,也不保留选型 preview 功能。AD 组保持原样,不展开嵌套组或主组,不映射为本服务权限。 密码成功仅保存 FACTOR_PASSWORD,待 MFA 页面要求十分钟内的密码因素;其他应用入口暂时 denyAll,尚未接入 MFA 或 Hydra challenge。监控 Basic 认证使用独立无状态安全链。 ## 验证 - 最终代码 8b6d18f:18 项 JVM 测试、前端构建和 bootJar 通过。 - 覆盖同连接 LDAP 查询、因素保存和过期、会话轮换、HTTPS、CSRF、退出及监控与人类认证隔离。 - 更新后的 Tailscale HTTPS 开发实例通过 1 项浏览器回归:原生 POST、失败清空密码、无 fetch/XHR、移动端布局。 - 早期 AD 路径曾通过维护者真实账号验收;最终 Spring Security 版本真实人类复验待反馈,不以夹具或合成用户名回归替代。 - 本轮未执行 Native 编译或原生认证测试;Native 仍是交付约束,留待阶段性验收。条件装配在 AOT 构建时确定,AD Native 构建须启用 iam.ad.enabled;此限制及验收项已写入 docs/native-validation.md。 ## Review 处理 - [x] 已删除 SignInAvailabilityFilter:使用 redirectToHttps;仅在 iam.ad.enabled=true 时装配登录 Controller 和 formLogin,未启用时由兜底链拒绝。测试确认 HTTP 跳转前不执行密码 bind 或退出。 ## 部署与文档 默认关闭 AD,启用时使用受信 LDAPS CA 与 HTTPS。仅更新已有 Tailscale 开发入口,生产 Go/Authelia/Gitea 链路未切换。生产入口限流、审计、MFA 与 Hydra 集成仍待实现。 使用说明见 docs/ad-login.md;[Wiki 设计与边界](https://git.ddupan.top/panxiao81/homelab-wiki/src/branch/main/architecture/independent-iam-draft.md)直接维护于 main。 本 PR 直接针对 main,统一包含原 #3、#4、#5 的最终代码;#3、#5 由本 PR 替代。代码持续更新于此 PR,未合并到 main。
panxiao81 changed title from 接入真实 AD 密码与直接所属组,停在待 MFA 状态 to 按 DDD 接入 AD 第一因素与 Spring Data LDAP 用户仓储 2026-09-27 16:55:51 +00:00
@@ -0,0 +7,4 @@
/** Owns first-factor ordering, lifetime and the identity to which further factors must bind. */
public final class LoginTransaction {
private static final Duration LIFETIME = Duration.ofMinutes(10);
Author
Owner

这里怎么写死了啊
留个config注入进来

这里怎么写死了啊 留个config注入进来
@@ -0,0 +6,4 @@
import java.util.UUID;
/** Owns first-factor ordering, lifetime and the identity to which further factors must bind. */
public final class LoginTransaction {
Author
Owner

说到底是靠什么在绑定session?时间戳?这可不太可靠吧?

说到底是靠什么在绑定session?时间戳?这可不太可靠吧?
panxiao81 changed title from 按 DDD 接入 AD 第一因素与 Spring Data LDAP 用户仓储 to 接入 AD 第一因素与 React 登录页面,由 Spring Security 管理认证 2026-09-27 17:46:13 +00:00
panxiao81 changed target branch from feat/browser-login-preview to main 2026-09-27 17:46:13 +00:00
panxiao81 added 8 commits 2026-09-27 17:46:13 +00:00
panxiao81 added 1 commit 2026-09-27 17:56:27 +00:00
panxiao81 merged commit 6d040658c8 into main 2026-09-27 17:59:37 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: panxiao81/iam-login#4