Files
jczxw-java/iam-api/docs/iam-api-dev-plan.md
T
gxwebsoft 5e86ebe6b7 feat(auth): 实现统一认证模块及登录策略
- 新增 ApiResult 统一响应封装类,规范前端接口返回结构
- 添加 AuthController,支持多种登录方式及用户信息接口
- 实现 AuthService,包含登录、登出、密码修改、绑定手机号、重置密码等功能
- 集成图形验证码校验和登录失败锁定机制,增强安全性
- 支持邮箱登录和手机号验证码登录,完善多样化认证策略
- 实现 JWT 令牌签发与吊销,确保会话安全管理
- 配置不同环境 application.yml 及配置,支持多租户和灵活缓存配置
- 增加 .gitignore 规则,屏蔽构建产物、IDE 文件和敏感配置
- 引入 AuthProperties 以配置登录与验证码策略参数
2026-09-23 11:59:45 +08:00

8.0 KiB
Raw Blame History

iam-api 开发计划

统一身份中心(Identity & Access Management)。目标:把「用户 / 租户 / 角色 / 权限 / 菜单 / 登录 / 令牌签发」从 open-api 里抽出来,成为 open-api 与 dp-api 共用的 唯一账号源,使 dp-api 可以脱离 open-api 独立售卖与部署。

1. 定位与边界

1.1 iam-api 负责

能力 说明
身份(Identity) 租户、用户、账号密码 / 邮箱 / 手机号、密码强度与找回、绑定手机
授权(Access) 角色、权限标识、菜单(菜单即权限载体)、用户-角色-菜单关系
会话(Session) 控制台登录态令牌(HS256)、登出吊销、登录失败锁定、登录审计
令牌(Token) 面向资源服务的 RS256 access token、refresh token、JWKS、introspect、revoke
客户端(Client) iam_client 注册表:登记 open-api / dp-api 等消费方及其允许的 scope / aud

1.2 iam-api 不负责

  • 开放平台的业务语义:应用管理、OAuth2 授权页、scope 字典、令牌签发统计(留在 open-api)。
  • 数据中台的业务数据:服务器、客户、订单、合同、发票、支付(留在 dp-api)。
  • 通用底座:云存储、系统设置、字典、附件、消息、审计(后续放 base-api)。

边界一句话:iam-api 只知道“你是谁、你能干什么”,不知道“你干的是什么业务”。

1.3 与 open-api / dp-api 的关系

                    ┌──────────────────────────────┐
                    │           iam-api            │
                    │ 账号/租户/角色/权限/菜单/令牌   │
                    └───────────┬──────────────────┘
             RS256 令牌 + JWKS  │  RS256 令牌 + JWKS
          ┌─────────────────────┴─────────────────────┐
          ▼                                           ▼
   ┌─────────────┐                             ┌─────────────┐
   │  open-api   │                             │   dp-api    │
   │  开放平台    │                             │  数据中台    │
   └─────────────┘                             └─────────────┘
  • 两个资源服务都只通过 JWKS 验签,不共享用户表、不共享对称密钥。
  • 同一个 user_id 可以在两个产品里拥有不同角色: iam_user_role 带 client_id(为空表示控制台全局角色),授权按消费者隔离。

2. 里程碑

M1 内核与骨架(本期)

  • Maven 工程、Spring Boot 3.5 / Java 25、Flyway、MyBatis-Plus
  • 统一返回结构、全局异常、分页与查询参数封装
  • 多租户上下文与 MyBatis-Plus 租户插件
  • 缓存抽象 CacheStore(Redis / 内存双实现,演示与测试免 Redis)

M2 身份与授权(本期)

  • sys_tenant / sys_user / sys_role / sys_menu / 关联表 / 登录审计
  • 租户、用户、角色、菜单的查询与管理接口
  • 用户带角色与权限集合,供控制台做按钮级权限

M3 登录与安全(本期)

  • 账号密码登录(图形验证码 + 失败锁定)
  • 邮箱登录、手机号验证码登录
  • 登出(令牌吊销)、/api/me、修改密码、绑定/换绑手机号、自助找回密码
  • HS256 会话令牌 + 认证过滤器 + 401/403 统一处理

M4 统一令牌与客户端(本期)

  • iam_client 客户端注册表与 scope 白名单
  • RS256 令牌签发:client_credentials / authorization_code(PKCE) / refresh_token
  • /api/v1/oauth/jwks 公钥集合、/api/v1/oauth/introspect、/api/v1/oauth/revoke
  • 授权码存储与一次性核销(iam_auth_code)

M5 迁出与联调(下一期)

  • open-api 改为 iam-api 的客户端:登录跳转/代理、用户信息改读 iam-api
  • dp-api 接入:JWKS 验签 + tenant_id / 角色映射
  • 存量用户迁移脚本(db_open.sys_user → iam_user)与双写过渡
  • 平台运营端(账号开通、跨租户管理)迁到 iam-api 或独立的 iam-admin

M6 单点登录与合规(远期)

  • SSO 会话表 iam_sso_session 与跨域免登票据
  • MFA(TOTP)、登录设备管理、异常登录提醒
  • 审计中心:把登录审计升级为操作审计

3. 数据模型

表 说明
sys_tenant 租户
sys_user 用户(BCrypt 密码,邮箱/手机号可空)
sys_role 角色
sys_user_role 用户-角色
sys_menu 菜单 / 权限点
sys_role_menu 角色-菜单
sys_login_record 登录审计
iam_client 接入方(client_id / secret / 允许 scope / 令牌有效期)
iam_auth_code OAuth2 授权码(一次性、短有效期)

所有业务表统一:del_flag 逻辑删除、create_time / update_time 应用层填充。

4. 接口一览(本期)

分组 接口
认证 POST /api/login、POST /api/loginByEmail、POST /api/loginBySms、POST /api/logout、GET /api/me、POST /api/changePassword、POST /api/resetPassword、POST /api/bindPhone、POST /api/bindPhone/captcha
验证码 GET /api/captcha、POST /api/sendSmsCaptcha、POST /api/sendEmailCaptcha
租户 GET/POST/PUT/DELETE /api/iam/tenant、GET /api/iam/tenant/{id}
用户 GET /api/iam/user、POST /api/iam/user、PUT /api/iam/user/{id}、DELETE /api/iam/user/{id}、POST /api/iam/user/{id}/resetPassword
角色 GET /api/iam/role、POST /api/iam/role、PUT /api/iam/role/{id}、DELETE /api/iam/role/{id}、PUT /api/iam/role/{id}/menus
菜单 GET /api/iam/menu/tree、POST /api/iam/menu、PUT /api/iam/menu/{id}、DELETE /api/iam/menu/{id}
客户端 GET /api/iam/client、POST /api/iam/client、PUT /api/iam/client/{id}、DELETE /api/iam/client/{id}、POST /api/iam/client/{id}/secret
令牌 POST /api/v1/oauth/token、GET /api/v1/oauth/jwks、POST /api/v1/oauth/introspect、POST /api/v1/oauth/revoke

5. 配置

配置项 说明 默认
server.port 服务端口 8900
iam.cache.type 缓存实现:redis / memory redis(demo/test 为 memory)
config.jwt.secret 控制台会话令牌密钥(HS256) 开发默认值,生产必须覆盖
config.iam-jwt.private-key 资源服务令牌私钥(RS256,PEM) 缺省时启动生成临时密钥并告警
config.internal-key introspect 调用方自证密钥 change-me

6. 部署

  • 端口 8900,与 open-api(8800) / dp-api(18800) 并存。
  • 生产用 Docker(Dockerfile + docker-compose.yml),MySQL + Redis 由编排提供。
  • 演示与测试走 -Pdemo / test profile,H2 + 内存缓存,无外部依赖。
  • Flyway 用独立迁移账号(FLYWAY_USER / FLYWAY_PASSWORD),与业务账号分离: Flyway 建连接时要读 performance_schema.user_variables_by_thread,业务账号不该为此扩权。 建号脚本 scripts/create-flyway-user.sql;无法授权时用 scripts/apply-migrations.sh 手工迁移。

7. 风险与对策

风险 对策
双用户表导致身份漂移 迁移期以 iam-api 为准,open-api / dp-api 只读;禁止双向写
令牌吊销的传播延迟 access token 短有效期(默认 2h)+ 资源服务就近校验 + introspect 兜底
Redis 不可用导致全员无法登录 CacheStore 降级策略与 iam.cache.type 显式切换,健康检查暴露状态
认证与业务耦合 资源服务只依赖 JWKS 公钥,不引入 iam-api 的代码依赖
迁移账号权限不足导致启动失败 Flyway 独立账号 + 建号脚本;退路是关闭 Flyway 用 scripts/apply-migrations.sh