# zest-auth
**Repository Path**: zestcc/zest-auth
## Basic Information
- **Project Name**: zest-auth
- **Description**: No description available
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-05
- **Last Updated**: 2026-07-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Zest Auth
Zest 生态**统一多租户与权限治理层**:管控面 Admin + 可嵌入 SDK(离线 Bundle / 在线同步)。
## 架构
```text
zest-auth/
├── zest-auth-common # ApiResponse、Bundle Schema、异常
├── zest-auth-spi # Identity / ConfigTransport / TenantResolver SPI
├── zest-auth-core # AuthRuntime、JWT、AuthHttpClient、权限评估
├── zest-auth-starter # Spring Boot 一键接入
├── plugins/
│ ├── zest-auth-identity-local # JWT + 本地用户解析
│ ├── zest-auth-identity-sso # ZestSSO 插件(SPI 扩展点)
│ ├── zest-auth-identity-ldap # LDAP/AD 认证插件
│ ├── zest-auth-identity-github # GitHub OAuth2 登录插件
│ ├── zest-auth-identity-google # Google OAuth2 登录插件
│ ├── zest-auth-identity-saml # SAML 2.0 SP 插件
│ ├── zest-auth-config-file # 离线 Bundle 文件
│ ├── zest-auth-config-http # 在线 HTTP 拉取
│ ├── zest-auth-alert-monitor # 告警 SPI(打通 zest-monitor)
│ └── zest-auth-metrics-prometheus # Prometheus Micrometer SPI
├── zest-auth-admin # 管控面(8095,单 jar + 内嵌 UI)
├── zest-auth-admin-ui # Vue3 + Element Plus
└── zest-auth-demo # SDK 示范应用(8096)
```
## Admin 完整能力
| 模块 | 功能 |
|------|------|
| 租户 | CRUD、允许产品 |
| 用户 | CRUD、角色绑定、重置密码、强制改密、自定义属性、CSV 导出 |
| 团队/组织 | 树形层级 CRUD、成员角色、团队负责人、邀请码、主团队 |
| 角色 | CRUD、权限绑定、团队上下文角色 |
| 权限 | CRUD(product/resource/action)、资源级权限、拒绝规则 |
| 产品 | 注册、角色映射规则 |
| Bundle | 预览 / 发布 / 历史版本 / 回滚 |
| SDK Token | 生成 / 吊销(`X-Auth-Token`) |
| OAuth2 | 授权服务器(Authorization Code / Client Credentials)、授权码流程、同意页 |
| 试验场 | SDK 接入向导(就绪检查 + YAML 片段)+ 在线探测 + Demo 联调验证 |
| 审计日志 | Admin 写操作自动记录 + 列表查询、团队/资源上下文 |
| 权限矩阵 | 角色 × 权限可视化矩阵(可勾选编辑,变更后需发布 Bundle) |
| 矩阵自动同步 | 系统设置中开启后,权限矩阵勾选变更自动发布 Bundle |
| SSO 联调 | 管控台「SDK 设置 → ZestSSO 联调」配置 Issuer / Client / Redirect |
| 社交登录 | GitHub / Google OAuth2 登录 + 账号绑定 |
| SAML 2.0 SP | 企业 SAML SSO,支持 SP-initiated 和 IdP-initiated |
| 登录安全 | 登录限流(内存/Redis)、密码策略、MFA(TOTP)、异动监测 |
| 会话管理 | Token 版本化、SPI 会话存储(内存/Redis)、主动吊销 |
| 品牌配置 | 名称、Logo、主色、登录页标题/背景/页脚自定义 |
| LDAP/AD | LDAP 和 Active Directory 认证 |
| 密码无感 | Magic Link 无密码登录 |
| 用户模拟 | 管理员模拟登录用户、审计追溯 |
| Webhook | SPI 事件钩子、Webhook 通知 |
| API 限流 | SPI API 频率限制(支持内存/Redis) |
| 配置导入导出 | JSON 配置全量导出/导入 |
| CORS 配置 | 可配置跨域来源、方法、凭证、缓存时间 |
| 监控告警 | Prometheus Micrometer 指标 + Alert SPI |
## SSO 联调(ZestSSO)
Demo 模块可选启用 SSO 插件:
```yaml
# application-zest-sso.yml(见 application-zest-sso.example.yml)
zest.sso.client.enabled: true
zest.sso.client.issuer: http://127.0.0.1:9000
```
| 端点 | 说明 |
|------|------|
| `GET /api/demo/sso/status` | SSO 联调状态 |
| `GET /api/demo/sso/authorize` | 浏览器 OIDC 跳转(PKCE)→ IdP 登录 |
| `GET /api/demo/sso/callback` | IdP 回调,签发 SDK JWT 后跳转 success 页 |
| `POST /api/demo/sso/login` | `{ "idToken": "..." }` → SDK JWT(集成测试 / 脚本用) |
管控台 **SDK 设置 → ZestSSO 联调** 可保存 Issuer / Client ID / Redirect URI,并一键打开 Demo 登录入口。
冒烟:`scripts/sso-integration-smoke.ps1`(含 WireMock E2E 单测)
## 双模 SDK
| 模式 | 配置 | 说明 |
|------|------|------|
| offline | `zest.auth.mode=offline` | 本地 Bundle + BCrypt 离线登录 |
| online | `zest.auth.mode=online` | 定时拉取 + 远程登录;Admin 冷启动不可达时 fallback classpath Bundle |
| hybrid | `zest.auth.mode=hybrid` | **推荐生产**:在线优先,Admin 不可达时可降级离线 |
### 导入即用(Starter 内置)
| 端点 | 说明 |
|------|------|
| `POST /zest-auth/login` | 登录拿 JWT(`zest.auth.controller.enabled=true`,默认开) |
| `GET /zest-auth/me` | 当前用户 |
| `GET /zest-auth/product-roles` | 产品角色映射 |
| `GET /zest-auth/health` | mode / bundleVersion / adminReachable |
仅引入 `zest-auth-starter` 依赖即可使用上述端点;开发环境 JWT Secret 默认与 Admin 对齐。
### 业务接入零配置异常处理
引入 `zest-auth-starter` 后自动注册 `AuthExceptionHandler`,`@RequirePermission` 失败统一返回 401/403。
## 快速开始
### 方式 A:零 MySQL(推荐本地试用)
无需安装 MySQL,使用 H2 嵌入式数据库:
```powershell
cd zest-auth
powershell -ExecutionPolicy Bypass -File .\scripts\dev-h2-up.ps1
```
- 控制台:http://localhost:8095(`admin` / `admin123`)
- H2 控制台:http://localhost:8095/h2-console(JDBC URL 见 `application-dev-h2.yml`)
- 数据持久化:`./data/zest_auth_dev.mv.db`(相对启动目录)
> `dev-h2` 仅用于本地开发,生产请使用 MySQL。
### 方式 B:MySQL
```sql
CREATE DATABASE zest_auth DEFAULT CHARSET utf8mb4;
```
```bash
cd zest-auth
mvn install -DskipTests
java -jar zest-auth-admin/target/zest-auth-admin-1.0.0-SNAPSHOT.jar
```
- 控制台:http://localhost:8095
- 默认账号:`admin` / `admin123`
```powershell
# 一键 Quickstart(编译 + 单测 + 结构门禁)
powershell -ExecutionPolicy Bypass -File .\scripts\quickstart.ps1
```
### Docker Compose 一键栈
需本机已安装 Docker Desktop:
```powershell
# 构建并启动 MySQL + Admin(8095) + Demo(8096)
powershell -ExecutionPolicy Bypass -File .\scripts\compose-up.ps1 -Build
# 仅启动(已构建镜像)
powershell -ExecutionPolicy Bypass -File .\scripts\compose-up.ps1
```
- Admin:http://localhost:8095(`admin` / `admin123`)
- Demo SSO 浏览器登录:http://localhost:8096/api/demo/sso/authorize(需 ZestSSO IdP 与 Demo 中 `zest.sso.client.*` 配置一致)
Compose 定义见 `deploy/docker-compose.yml`。
## 业务接入
```xml
cn.zest.auth
zest-auth-starter
1.0.0-SNAPSHOT
```
配置见 `zest-auth-starter/src/main/resources/application-zest-auth.example.yml`
生态接入详见 [docs/INTEGRATION.md](docs/INTEGRATION.md)
**注意**:`zest.auth.jwt.secret` 须与 Admin 的 `zest.auth.admin.sdk-jwt-secret` 一致。
```java
@Autowired AuthRuntime authRuntime;
@Autowired AuthHttpClient authHttpClient; // 远程 API 封装
@RequirePermission("order:create")
public void createOrder() { ... }
```
## SDK 开放 API(在线能力)
| 接口 | 说明 |
|------|------|
| `GET /api/v1/bundle?sinceVersion=` | 增量拉取 Bundle |
| `POST /api/v1/auth/login` | 远程登录(返回 SDK JWT) |
| `POST /api/v1/auth/verify` | 校验 Token |
| `POST /api/v1/auth/check` | 权限检查 |
| `GET /api/v1/auth/me` | 当前主体 |
请求头:`X-Auth-Token: `
## 与 ZestSSO
Zest Auth **不替代 IdP**,提供 Bundle 契约 + 权限 SDK。ZestSSO 通过 `zest-auth-identity-sso` 插件接入。
## 端口
| 组件 | 端口 |
|------|------|
| Admin | 8095 |
| Demo | 8096 |
| Admin UI dev | 5295 |
| 默认账号 | `admin` / `admin123` |
## CORS 配置
Admin 内置可配置 CORS,通过 `application.yml` 调整:
```yaml
zest:
auth:
admin:
cors-enabled: true # 是否启用 CORS(默认 true)
cors-allowed-origins: "" # 允许的来源,空则允许所有;逗号分隔
cors-allowed-methods: "GET,POST,PUT,DELETE,PATCH,OPTIONS"
cors-allow-credentials: true # 是否允许携带凭证
cors-max-age: 3600 # 预检缓存时间(秒)
```
生产环境建议配置明确的 `cors-allowed-origins`,如 `https://admin.example.com`。
## 社交登录插件
Zest Auth 通过 SPI 插件支持多种社交/企业登录方式:
| 插件 | 身份提供商 | 配置前缀 |
|------|-----------|---------|
| identity-github | GitHub OAuth App | `zest.auth.identity.github` |
| identity-google | Google OAuth 2.0 | `zest.auth.identity.google` |
| identity-ldap | LDAP / Active Directory | `zest.auth.identity.ldap` |
| identity-saml | SAML 2.0 IdP(如 Okta、Azure AD) | `zest.auth.identity.saml` |
| identity-sso | ZestSSO OIDC | `zest.sso.client` |
社交/企业登录回调统一由 `POST /api/auth/social/{provider}/callback` 处理,支持自动账号关联和新用户创建。
## OAuth2 授权服务器
Zest Auth 内建 OAuth2 授权服务器支持:
- **授权码模式**(Authorization Code):支持 PKCE
- **客户端凭证模式**(Client Credentials)
- **OIDC Discovery**:`/.well-known/openid-configuration`
- **同意页面**:用户首次授权需在同意页确认
- **Token 管理**:Admin UI 可查看和吊销已签发的 Token