# iam-platform **Repository Path**: hanshg/iam-platform ## Basic Information - **Project Name**: iam-platform - **Description**: No description available - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-07-22 - **Last Updated**: 2026-08-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 统一身份与访问控制管理系统 (IAM System) 基于 **Spring Boot 3.x + Vue 3** 的企业级统一身份认证与访问控制管理系统。支持多租户组织架构、RBAC 权限模型、SSO 单点登录、OAuth2/OIDC/SAML/CAS 多协议接入、SCIM 标准协议、通知策略引擎(同步/异步/定时)、审计日志等完整 IAM 能力。 ## 目录 - [系统架构](#系统架构) - [功能特性](#功能特性) - [技术栈](#技术栈) - [项目结构](#项目结构) - [快速开始](#快速开始) - [详细部署指南](#详细部署指南) - [数据库设计](#数据库设计) - [API 接口概览](#api-接口概览) - [开发规范](#开发规范) - [故障排查](#故障排查) - [配置说明](#配置说明) - [更新日志](#更新日志) --- ## 系统架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ 前端层 (Vue 3 + Vite) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 管理后台 │ │ 自助中心 │ │ 登录门户 │ │ SSO 客户端 │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ API 网关层 (RESTful) │ │ Sa-Token 认证 / JWT 对外 API / 社交认证回调 / 文件上传 │ ├─────────────────────────────────────────────────────────────┤ │ 业务服务层 (Spring Boot 3.x) │ │ 身份管理 │ 应用管理 │ 权限管理 │ 策略引擎 │ 审计日志 │ ├─────────────────────────────────────────────────────────────┤ │ 数据访问层 (MyBatis-Plus) │ │ MySQL 8.x │ Redis 6.x │ Druid 连接池 │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 功能特性 ### 1. 身份管理 - **用户管理**:用户 CRUD、启用/停用/锁定、重置密码、Excel 批量导入导出、按组织架构树筛选 - **用户类型**:正式员工、临时员工等分类管理,支持启停控制 - **组织管理**:树形组织架构(支持拖拽排序)、组织转移/合并、启停管理、组织类型配置(公司/部门/小组/虚拟组织),图标按类型区分颜色 - **岗位管理**:岗位 CRUD、关联组织、启停控制 - **分组管理**:静态/动态分组,支持用户/组织/岗位分组管理 ### 2. 应用管理 - **应用列表**:应用 CRUD、启用/停用、图标上传、应用类型分类 - **SSO 客户端**:独立的 SSO 客户端配置管理页面,支持多种协议 - **IdP 服务端**:身份提供商配置,支持 OAuth2/OIDC/SAML/CAS 协议 - **应用账号**:账号开通/回收、孤儿账号管理、批量操作 - **字段映射与同步**:应用字段映射配置、同步策略管理 ### 3. 权限管理 - **角色管理**:RBAC 角色管理、菜单权限授权、启停控制 - **菜单管理**:树形菜单/按钮权限配置(支持拖拽排序)、图标选择器 - **数据权限**:字段级读写控制、按组织/岗位维度授权 - **接口权限**:API 端点权限控制、按模块(user/org/position)授权 - **JWT API 管理**:对外 API 端点注册、JWT 客户端认证配置(Basic/OAuth2/自定义 Header) ### 4. 策略引擎 - **密码策略**:强度规则(长度/复杂度)、有效期、首次登录强制修改、历史密码检查 - **锁定策略**:登录重试次数、锁定时长、自动解锁 - **通知策略**:多渠道通知(站内/邮件/短信)模板配置,支持 **同步发送/异步发送/定时发送** 三种发送方式,接收者类型(全员/管理员/分组/自身等) - **登录页策略**:自定义登录页面主题、背景、LOGO 等 - **唯一策略**:字段唯一性校验规则配置 ### 5. 授权中心 - **权限模型**:基于分组/岗位/组织/属性的权限模型配置 - **供应策略**:账号/组织/岗位供应策略,生命周期管理(开通/回收) ### 6. 审计与记录 - **审计日志**:操作记录查询、按时间/模块/操作人筛选、物理删除与清空 - **同步记录**:数据同步任务监控、同步状态跟踪 - **邮件日志**:邮件发送记录查询、发送状态追踪 ### 7. 认证与 SSO - **多协议支持**:OAuth2 / OIDC / SAML2 / CAS 单点登录协议 - **SCIM 标准**:SCIM 2.0 用户/分组协议接口 - **社交认证**:微信、企业微信、QQ、钉钉、飞书、GitHub、Gitee 等第三方登录 - **JWT 对外 API**:独立认证体系(Basic/OAuth2 Bearer),支持用户/组织/岗位 20+ 个对外接口 - **自助中心**:普通用户自助修改密码、查看应用、个人信息管理 ### 8. 通知系统 - **通知策略引擎**:基于策略配置自动触发多渠道通知,支持三种发送方式: - **同步发送(SYNC)**:调用方阻塞等待通知发送完成 - **异步发送(ASYNC)**:通过 Spring 线程池异步执行,调用方立即返回 - **定时发送(SCHEDULED)**:指定未来时间自动发送,任务持久化到数据库,由后台轮询器(每30秒)自动执行 - **消息通知浮动组件**:实时推送系统消息 - **邮件服务**:支持 SMTP 配置、邮件模板、发送记录追踪 - **短信服务**:阿里云短信验证码(用于忘记密码、登录等场景) --- ## 技术栈 ### 后端 | 技术 | 版本 | 用途 | |------|------|------| | Spring Boot | 3.2.5 | 基础框架 | | JDK | 17 | 运行环境 | | Sa-Token | 1.37.0 | 认证与鉴权(Token 管理、权限校验、单点登录) | | MyBatis-Plus | 3.5.5 | ORM 框架(分页、逻辑删除、自动填充) | | MySQL Connector/J | 8.x | MySQL 驱动 | | Druid | 1.2.20 | 数据库连接池(SQL 监控、防注入) | | Redis | - | 缓存、Session 存储、Sa-Token 分布式会话 | | Lombok | - | 简化实体代码 | | Hutool | 5.8.25 | 工具库(加密、日期、HTTP、文件等) | | Knife4j | 4.4.0 | OpenAPI 3 接口文档 | | EasyExcel | 3.3.3 | Excel 导入导出 | | Spring Mail | - | 邮件发送 | | Spring AOP | - | 审计日志切面 | | Aliyun SMS SDK | 2.0.24 | 阿里云短信验证码 | | Spring LDAP | - | LDAP 身份源对接(可选) | | Spring Async | - | 异步任务线程池(通知异步发送) | | Spring Scheduling | - | 定时任务(通知定时发送轮询) | ### 前端 | 技术 | 版本 | 用途 | |------|------|------| | Vue | 3.4.21 | 前端框架(Composition API) | | Vite | 5.2.6 | 构建工具 | | Element Plus | 2.6.3 | UI 组件库 | | Vue Router | 4.3.0 | 路由管理 | | Pinia | 2.1.7 | 状态管理 | | Axios | 1.6.8 | HTTP 请求 | | js-cookie | 3.0.5 | Cookie 操作 | | crypto-js | 4.2.0 | AES 加密(密码传输) | | ECharts | 5.5.0 | 数据图表 | | xlsx | 0.18.5 | 表格导入导出 | | @element-plus/icons-vue | 2.3.1 | 图标库 | | sortablejs | 1.15.7 | 拖拽排序(菜单、组织树) | | nprogress | 0.2.0 | 页面加载进度条 | | Sass | 1.72.0 | CSS 预处理器 | --- ## 项目结构 ``` iam-platform/ ├── backend/ # 后端项目 │ ├── pom.xml # Maven 配置 │ ├── sql/ # SQL 脚本目录 │ │ ├── dump-iam_platform-*.sql # 数据库完整备份(含表结构+种子数据) │ │ ├── seed_*.sql # 增量脚本(功能模块种子数据) │ │ └── iam.sql # 基础初始化脚本 │ └── src/main/ │ ├── java/com/yz/iam/ │ │ ├── IamApplication.java # 启动类 │ │ ├── config/ # 配置类 │ │ │ ├── AsyncConfig.java # 异步线程池配置 │ │ │ ├── JacksonConfig.java # JSON 日期格式配置 │ │ │ ├── JwtAuthInterceptor.java # JWT 对外 API 认证拦截 │ │ │ ├── SaTokenConfig.java # Sa-Token 配置 │ │ │ ├── MyBatisPlusConfig.java # MyBatis-Plus 配置 │ │ │ ├── RedisConfig.java # Redis 配置 │ │ │ ├── Knife4jConfig.java # 接口文档配置 │ │ │ ├── CorsConfig.java # 跨域配置 │ │ │ ├── MetaObjectHandler.java # 自动填充处理器 │ │ │ └── StpInterfaceImpl.java # Sa-Token 权限接口实现 │ │ ├── common/ # 通用组件 │ │ │ ├── result/ # 统一返回封装 (R, PageResult) │ │ │ ├── exception/ # 全局异常处理 + 自定义异常 │ │ │ ├── constant/ # 业务常量枚举 │ │ │ └── utils/ # 工具类 (AES, File, Date 等) │ │ ├── entity/ # 实体类 (40+) │ │ ├── dto/ # 数据传输对象 │ │ ├── mapper/ # MyBatis-Plus Mapper 接口 │ │ ├── service/ # 业务逻辑层接口 + 实现 │ │ ├── controller/ # 控制器层 (50+ Controller) │ │ └── resources/ │ │ └── application.yml # 主配置文件 │ └── test/ # 测试代码 ├── frontend/ # 前端项目 │ ├── package.json │ ├── vite.config.js # Vite 构建配置 │ ├── index.html │ └── src/ │ ├── main.js # 入口文件 │ ├── App.vue # 根组件 │ ├── api/ # API 接口封装 │ ├── assets/ # 静态资源 │ ├── components/ # 公共组件 │ ├── layout/ # 布局组件 │ ├── router/ # 路由配置 │ ├── store/ # Pinia 状态管理 │ ├── utils/ # 工具函数 │ └── views/ # 页面视图 └── README.md ``` --- ## 快速开始 ### 环境要求 | 组件 | 最低版本 | 说明 | |------|---------|------| | JDK | 17+ | 运行环境 | | MySQL | 8.0+ | 数据存储 | | Redis | 6.0+ | 缓存、Session | | Node.js | 18+ | 前端构建 | | Maven | 3.8+ | Java 构建 | ### 步骤一:初始化数据库 **方式一:使用完整备份文件(推荐,含表结构+全部种子数据)** ```bash # 1. 创建数据库(utf8mb4 字符集) mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS iam_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" # 2. 导入完整备份 mysql -u root -p iam_platform < backend/sql/dump-iam_platform-*.sql # 3. 执行增量 SQL(如功能更新后) mysql -u root -p iam_platform < backend/sql/seed_notification_send_method.sql ``` **方式二:使用基础初始化脚本** ```bash mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS iam_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" mysql -u root -p iam_platform < backend/sql/iam.sql ``` ### 步骤二:配置数据库连接 编辑 `backend/src/main/resources/application.yml`: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/iam_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: Root!1 # 修改为你的数据库密码 data: redis: host: localhost port: 6379 database: 5 # Redis 库号 password: 123456 # 修改为你的 Redis 密码 ``` ### 步骤三:启动后端 ```bash cd backend # 编译 mvn clean compile -q # 开发模式启动 mvn spring-boot:run # 或打包后运行 mvn clean package -DskipTests java -jar target/iam-platform-1.0.0.jar ``` 启动成功后访问接口文档:http://localhost:8080/api/doc.html ### 步骤四:启动前端 ```bash cd frontend # 安装依赖 npm install # 开发模式启动 npm run dev # 生产构建 npm run build # 预览生产构建 npm run preview ``` ### 步骤五:访问系统 | 入口 | 地址 | 说明 | |------|------|------| | 前端页面 | http://localhost:5173 | Vite 开发服务器 | | 后端 API | http://localhost:8080/api | RESTful 接口前缀 | | 接口文档 | http://localhost:8080/api/doc.html | Knife4j Swagger UI | | 默认账号 | admin / admin123 | 超级管理员 | --- ## 详细部署指南 ### 生产环境部署 #### 1. 后端打包 ```bash cd backend mvn clean package -DskipTests # 产物:backend/target/iam-platform-1.0.0.jar ``` **启动脚本示例(Linux):** ```bash #!/bin/bash # start.sh APP_NAME=iam-platform-1.0.0.jar LOG_FILE=logs/app.log nohup java -jar $APP_NAME \ -Dspring.profiles.active=prod \ -DDB_PASSWORD=your_password \ -DREDIS_PASSWORD=your_password \ > $LOG_FILE 2>&1 & echo "Application started. PID: $!" ``` #### 2. 前端打包 ```bash cd frontend npm run build # 产物:frontend/dist/ 目录 ``` #### 3. Nginx 配置 ```nginx server { listen 80; server_name iam.yourcompany.com; # 前端静态资源 root /var/www/iam-platform/frontend/dist; index index.html; # 前端路由(单页应用) location / { try_files $uri $uri/ /index.html; } # 后端 API 代理 location /api/ { proxy_pass http://127.0.0.1:8080/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket 支持(如需要) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 静态资源缓存 location /assets/ { expires 30d; add_header Cache-Control "public, immutable"; } } ``` #### 4. 系统服务化(systemd) 创建 `/etc/systemd/system/iam-platform.service`: ```ini [Unit] Description=IAM Platform Backend After=network.target mysql.service redis.service [Service] Type=simple User=appuser WorkingDirectory=/opt/iam-platform/backend ExecStart=/usr/bin/java -jar iam-platform-1.0.0.jar Restart=always RestartSec=5 Environment="DB_PASSWORD=your_password" Environment="REDIS_PASSWORD=your_password" [Install] WantedBy=multi-user.target ``` 启用服务: ```bash sudo systemctl daemon-reload sudo systemctl enable iam-platform sudo systemctl start iam-platform sudo systemctl status iam-platform ``` --- ## 数据库设计 共 **40+ 张表**,覆盖 IAM 全部业务模块: ### 核心表 | 分类 | 表名 | 说明 | |------|------|------| | **用户** | sys_user | 用户主表(基础信息、状态、密码) | | | sys_user_type | 用户类型(正式/临时/外包) | | | sys_user_role | 用户-角色关联 | | **组织** | sys_org | 组织架构树(支持无限层级) | | | sys_org_type | 组织类型(公司/部门/小组/虚拟) | | **岗位** | sys_position | 岗位管理 | | **分组** | sys_group | 静态/动态分组 | | **角色权限** | sys_role | 角色表(RBAC) | | | sys_role_menu | 角色-菜单关联 | | | sys_menu | 菜单与按钮权限(树形结构) | ### 应用相关表 | 表名 | 说明 | |------|------| | sys_app | 应用主表(SSO 配置、协议类型) | | sys_app_type | 应用分类 | | sys_app_account | 应用账号(开通状态、孤儿账号标记) | | sys_app_field_mapping | 应用字段映射 | | sys_app_field_sync | 字段同步记录 | | sys_sso_client | SSO 客户端配置 | ### 权限控制表 | 表名 | 说明 | |------|------| | sys_permission_model | 权限模型定义 | | sys_provision_strategy | 供应策略 | | sys_data_permission | 数据权限规则 | | sys_api_permission | 接口权限规则 | | sys_api_endpoint | API 端点注册 | | sys_jwt_client | JWT 客户端配置(Basic/OAuth2 认证) | | sys_jwt_access_token | OAuth2 Access Token 表 | ### 策略配置表 | 表名 | 说明 | |------|------| | sys_password_policy | 密码策略 | | sys_lock_policy | 锁定策略 | | sys_notification_policy | 通知策略(支持 SYNC/ASYNC/SCHEDULED) | | sys_notification_task | 定时通知任务表(PENDING/SENT/FAILED/CANCELLED) | | sys_login_page_strategy | 登录页策略 | | sys_uniqueness_policy | 唯一性策略 | ### 日志审计表 | 表名 | 说明 | |------|------| | sys_audit_log | 操作审计日志 | | sys_sync_record | 数据同步记录 | | sys_mail_config | 邮件服务器配置 | | sys_mail_template | 邮件模板 | | sys_mail_log | 邮件发送记录 | ### 身份源与认证表 | 表名 | 说明 | |------|------| | sys_identity_source | 上游身份源(LDAP/AD/HR 系统) | | sys_idp_config | IdP 服务端配置 | | sys_idp_auth_code | IdP 授权码表 | | sys_social_auth | 社交认证配置 | | sys_notification | 系统通知消息 | --- ## API 接口概览 所有接口以 `/api` 为前缀,使用 Sa-Token `Authorization` Header 进行认证。 ### 认证方式 **管理后台认证**:Sa-Token Session(Cookie/Header 自动携带) ```http Authorization: Bearer {Sa-Token} ``` **对外 API 认证**: 1. **Basic Auth**:`Authorization: Basic {base64(clientId:clientSecret)}` 2. **OAuth2 Bearer**:`Authorization: Bearer {access_token}`(通过 `/openapi/token` 获取) 3. **自定义 Header**:`X-Client-Id` + `X-Client-Secret` ### 接口模块 | 模块 | 路径前缀 | 主要接口说明 | |------|----------|-------------| | **认证** | `/auth` | 登录/登出/获取用户信息/修改密码/社交认证回调 | | **用户** | `/user` | 分页查询、CRUD、启用/禁用、锁定/解锁、重置密码、导入/导出 | | **组织** | `/org` | 树形查询、CRUD、启用/禁用、拖拽排序、类型管理 | | **岗位** | `/position` | 列表/分页、CRUD、启用/禁用 | | **角色** | `/role` | 分页、CRUD、启用/禁用、菜单授权 | | **菜单** | `/menu` | 树形查询、CRUD、启用/禁用、拖拽排序 | | **应用** | `/app` | 分页、CRUD、启用/禁用、账号管理、字段映射 | | **分组** | `/group` | 分页、CRUD、成员管理 | | **权限** | `/permission` | 数据权限、接口权限查询与配置 | | **JWT** | `/jwt` | 客户端管理、API 端点注册 | | **对外 API** | `/openapi/**` | 用户/组织/岗位的 20+ 个对外接口(独立 JWT 认证) | | **策略** | `/policy` | 密码/锁定/通知/登录页/唯一策略的 CRUD | | **授权** | `/auth-model` | 权限模型、供应策略 | | **审计** | `/audit-log` | 操作日志查询、导出 | | **邮件** | `/mail` | 配置/模板/日志查询与发送 | | **仪表盘** | `/dashboard` | 用户统计、登录趋势、分布数据 | | **文件** | `/file` | 头像/应用图标上传 | | **SSO** | `/sso/**` | SAML/OIDC/OAuth2/CAS 协议端点 | | **SCIM** | `/scim/**` | SCIM 2.0 标准协议接口 | | **IdP** | `/idp/**` | OAuth2 授权服务器端点、JWKS 发现端点 | --- ## 开发规范 ### 后端开发规范 - **统一返回结构**:`R` 包含 `code`/`msg`/`data`,异常统一由 `GlobalExceptionHandler` 处理 - **分页查询**:使用 MyBatis-Plus `Page` 对象,返回 `PageResult`(四参数构造:`records, total, size, current`) - **逻辑删除**:所有业务表使用 `deleted` 字段,MyBatis-Plus 自动处理(`deleted=1` 为删除) - **自动填充**:`create_time`/`update_time`/`create_by`/`update_by` 由 `MetaObjectHandler` 自动填充 - **权限控制**:Sa-Token `@SaCheckPermission("模块:资源:动作")` 注解,如 `@SaCheckPermission("user:add")` - **审计日志**:`@AuditLog` 注解 + `AuditLogAspect` 切面自动记录操作日志 - **API 前缀**:后端 `context-path: /api`,前端请求统一走 `/api/**` ### 前端开发规范 - **组件语法**:统一使用 `