Files
Edu/services/iam
SpecialX 61d824924a fix: 修复集成测试中发现的全部 bug — 15 服务端到端验证通过
修复涵盖 6 大类问题:

1. api-gateway
   - 路径前缀剥离 /api 而非 /api/v1,保留下游 /v1/ controller 前缀
   - JWKS URL 默认值修复
   - publicPaths 白名单对齐 /v1/iam/*

2. iam
   - iam.module.ts exports 补充 PermissionCacheService 和 IamRepository
   - main.ts resolveProtoPath() 多路径探测 proto 文件

3. core-edu
   - app.module.ts AuthMiddleware 全局注册

4. BFF 层 GraphQL 端点(teacher-bff / parent-bff / student-bff)
   - teacher-bff: mock dataScope OWN→SELF 对齐 GraphQL enum;WHATWG Request header .get() 提取
   - parent-bff: handleNodeRequestAndResponse 不存在 → 直接 yoga(req,res);WHATWG Request header .get() 提取
   - student-bff: auth.resolver 移除 ActionState 信封返回扁平对象;WHATWG Request header .get() 提取

5. ai
   - Kafka 事务降级 + 10s 超时
   - gRPC 拦截器降级
   - dev mode 禁用事务模式

6. 前端 + 共享包
   - teacher-portal: MF 插件条件实例化 + transpilePackages + extensionAlias
   - ui-components: error-boundary.tsx 添加 use client
   - ui-tokens: tailwind-theme.css 移除 @layer base
   - shared-ts: 导出从源码改为 dist 编译产物;OutboxModule global:true

7. infra
   - .gitignore 补充 keys/ *.pem *.key secrets/ 排除规则
   - infra/init-sql/02-all-services-schema.sql 36 张表 DDL

验证结果:
- TS typecheck: 19 个 workspace 项目全部通过
- Go vet + Ruff: 通过
- 15 服务全部启动成功
- 3 个 BFF GraphQL 端点 + 4 个前端页面全部 200
- Gateway → iam → core-edu 端到端链路验证通过

AI identity: trae-main(集成测试修复会话)
2026-07-11 01:41:46 +08:00
..

IAM Service

身份与访问管理服务Identity and Access Management

版本v0.2.0(对齐 coord-final-decisions I1-I8 + president §2.15/§2.16/§3.2/§5.5 详细设计见 02-architecture-design.md

职责

  • 用户注册 / 登录 / 刷新令牌 / 登出
  • JWT RS256 签发access 15min + refresh 7dayjti 黑名单)
  • 角色Role与权限Permission管理三层角色模型system/organization/temporary
  • DataScope 6 级数据范围self/subject/class/grade/school/all
  • 视口Viewport配置查询
  • 学生-家长关系管理(GetChildrenByParent
  • 审计日志(iam_user_audit_log + AuditCreated 事件)
  • JWKS 公钥暴露(供 api-gateway 验签)
  • 双入口REST /v1/iam/* + gRPC 50052package next_edu_cloud.iam.v112 RPC

技术栈

  • NestJS 10 + TypeScriptESMNodeNext
  • Drizzle ORM + MySQL10 张表)
  • bcrypt 密码哈希cost ≥ 12
  • jsonwebtoken RS256本地文件密钥
  • ioredis权限缓存 TTL 5min + token jti 黑名单)
  • kafkajs + shared-ts OutboxModule事务性事件发布
  • @nestjs/microservices + @grpc/grpc-jsgRPC server
  • pino 日志 / prom-client 指标 / OpenTelemetry 链路

端口

服务 端口 备注
iam HTTP 3002 REST 入口(PORT
iam gRPC 50052 gRPC 入口(GRPC_PORT

环境变量

变量 说明 默认值
PORT HTTP 端口 3002
GRPC_PORT gRPC 端口 50052
DATABASE_URL MySQL 连接串
REDIS_URL Redis 连接串
IAM_PRIVATE_KEY_PATH RS256 私钥文件路径
IAM_PUBLIC_KEY_PATH RS256 公钥文件路径
JWT_ISSUER JWT 签发者 next-edu-cloud
JWT_AUDIENCE JWT 受众 next-edu-cloud
JWT_KEY_ID 密钥 IDkid用于 JWKS 轮换) iam-rs256-v1
ACCESS_TOKEN_TTL access_token TTL 15m
REFRESH_TOKEN_TTL_DAYS refresh_token TTL 7
KAFKA_BROKERS Kafka broker 列表(逗号分隔)
KAFKA_CLIENT_ID Kafka client ID iam-service
OTEL_EXPORTER_OTLP_ENDPOINT OTel OTLP 端点(可选)
LOG_LEVEL 日志级别 info
NODE_ENV 环境标识 development

REST API

Method Path 权限 说明
POST /v1/iam/register 公开 注册
POST /v1/iam/login 公开 登录
POST /v1/iam/refresh 公开 刷新令牌(轮换 + 旧 jti 加黑名单)
POST /v1/iam/logout IAM_USER_READ 登出
GET /v1/iam/me IAM_USER_READ 当前用户信息
GET /v1/iam/viewports IAM_USER_READ 当前用户视口
GET /v1/iam/permissions/effective IAM_USER_READ 当前用户有效权限
GET /v1/iam/children IAM_USER_READ 家长的孩子列表
GET /v1/iam/roles IAM_ROLE_MANAGE 角色列表
GET /v1/iam/permissions IAM_ROLE_MANAGE 权限点列表
GET /v1/iam/audit IAM_AUDIT_READ 审计日志
GET /v1/iam/.well-known/jwks.json 公开 RS256 公钥 JWK Set

gRPC API

12 RPCproto 定义见 packages/shared-proto/proto/iam.protopackage next_edu_cloud.iam.v1

Register / Login / RefreshToken / Logout / GetUserInfo / BatchGetUsers / GetEffectivePermissions / GetEffectiveAccess / GetEffectiveDataScope / GetViewports / GetPublicKey / GetChildrenByParent

健康检查

端点 用途 鉴权
GET /healthz 存活探针liveness仅返回进程状态
GET /readyz 就绪探针readiness检查 DB/Redis/Kafka/JWKS/gRPC 5 依赖,失败返回 503

数据表10 张)

表名 用途
iam_users 用户主表
iam_roles 角色表role_type + level
iam_user_roles 用户-角色绑定
iam_permissions 权限点表
iam_role_permissions 角色-权限映射
iam_refresh_tokens refresh token含 jti
iam_role_viewports 角色-视口配置(含 level
iam_student_guardians 学生-家长关系
iam_user_audit_log 审计日志
iam_password_history 密码重用限制

DDL + 种子数据见 scripts/iam-init.sql

Kafka 事件

Topic 事件
edu.iam.user.events UserCreated
edu.iam.role.events RoleChanged
edu.iam.audit.created AuditCreated

通过 shared-ts OutboxModule 事务性发布at-least-once + idempotent producer

开发

# 安装依赖
pnpm install

# 初始化数据库(需先启动 MySQL + Redis + Kafka
mysql -u root -p < scripts/iam-init.sql

# 生成 RS256 密钥对
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem

# 启动开发服务
pnpm --filter @edu/iam-service dev

# 质量校验
pnpm --filter @edu/iam-service lint
pnpm --filter @edu/iam-service typecheck