# client-access-gateway **Repository Path**: git4chen/client-access-gateway ## Basic Information - **Project Name**: client-access-gateway - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-09 - **Last Updated**: 2026-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # client-access-gateway 三方系统调用管控网关。作为 API 提供方,面向外部客户端(Client)开放业务接口,通过 **OAuth 2.0 `client_credentials`** 认证调用方,并对每个请求实施**授权(scope)→ 状态 → 限流 → 审计**四层管控,保障接口安全与可追溯。 > 当前为 MVP:单实例部署,本地缓存(Caffeine)为唯一缓存层。 ## 功能特性 - **客户端认证**:`client_credentials` 授权模式换令牌,凭证 BCrypt 哈希存储,有状态 Access Token 落 SQLite + 本地缓存校验 - **接口授权(scope)**:接口声明所需 scope,校验令牌携带的 scope 是否覆盖,不足返回 `403 INSUFFICIENT_SCOPE` - **状态管控**:Client 禁用/启用、Token 吊销/黑名单,即时生效(`401 CLIENT_DISABLED` / `401 TOKEN_REVOKED`) - **接口限流**:按 Client × 接口固定窗口限流,参数可配置(`429 RATE_LIMITED`) - **调用审计**:每次调用同步落库,含 Client、接口、结果、耗时,可查询 - **验证控制台**:内嵌静态单页,可视化演示认证与五层管控,审计实时刷新、点击查看详情 ## 技术栈 | 组件 | 说明 | |------|------| | Java | JDK 11 | | Spring Boot | 2.7.18(Web + Validation) | | MyBatis Plus | 3.5.5(ORM) | | SQLite | 数据存储 | | Caffeine | 本地缓存 | | OAuth 2.0 | `client_credentials` 授权模式 | | Spring Security Crypto | BCrypt | ## 快速开始 **前置**:JDK 11、Maven 3.6+。 ```bash # 打包 mvn clean package # 启动(自动创建 data/ 目录与 SQLite 库,种子数据:demo / demo-read 两个客户端) java -jar target/client-access-gateway-0.1.0.jar ``` 启动后访问 **Verification Console**: ### 内置演示客户端 | client_id | client_secret | scope | 用途 | |-----------|---------------|-------|------| | `demo` | `demo-secret` | read, write | 完整权限,演示 200 | | `demo-read` | `demo-read-secret` | read | 仅读,演示 `403 INSUFFICIENT_SCOPE` | ## 核心接口 ### 认证 ``` POST /oauth/token Content-Type: application/json {"grantType":"client_credentials","clientId":"demo","clientSecret":"demo-secret"} ``` 响应:`{"access_token":"...","token_type":"Bearer","expires_in":7200,"scope":["read","write"]}` ### 调用受管控接口 ``` GET /api/orders # 需 scope=read POST /api/orders # 需 scope=write Authorization: Bearer ``` ### 管控运维(Verification Console 内部使用) | 接口 | 说明 | |------|------| | `POST /internal/control/revoke-token?tokenHash=` | 吊销令牌 | | `POST /internal/control/disable-client?clientId=` | 禁用 Client | | `DELETE /internal/control/disable-client?clientId=` | 重新启用 Client | | `POST /internal/control/refresh-cache` | 重置缓存 / 限流 | | `GET /internal/control/audit?limit=N` | 查询最近审计记录 | ## 管控链 ``` 认证 → 授权(scope) → 状态/黑名单 → 限流 → 审计 ``` | 层 | 判定 | 失败返回 | |----|------|---------| | 认证 | Bearer 令牌有效、未过期、未吊销 | `401` | | 授权 | 令牌 scope 覆盖接口所需 scope | `403 INSUFFICIENT_SCOPE` | | 状态 | Client 启用 / 令牌未黑名单 | `401 CLIENT_DISABLED` / `401 TOKEN_REVOKED` | | 限流 | Client×接口 窗口内未超限 | `429 RATE_LIMITED` | | 审计 | 记录每次调用 | — | 统一错误体:`{"code":"...","message":"..."}`。 ## 项目结构 ``` src/main/java/com/example/accesscontrol ├── controller/ # /oauth/token、受管控接口、管控运维接口 ├── filter/ # 认证 + 管控过滤链 ├── service/ # 认证/令牌/授权/状态/限流/审计 ├── cache/ # Caffeine 本地缓存 ├── mapper/ # MyBatis Plus Mapper ├── entity/ # SQLite 表实体 ├── security/ # BCrypt / SHA-256 ├── exception/ # 错误码 └── config/ # 配置、种子数据、异常处理 src/main/resources/static/index.html # Verification Console ``` ## 文档索引 - 方案说明:`docs/access-control-mvp.md`、`docs/frontend-verification-mvp.md` - 决策记录(ADR):`docs/adr/0001` ~ `0006` - 术语表:`CONTEXT.md` - Spec / Design / Tickets:`.scratch/access-control-mvp/` ## 路线(Out of Scope 于 MVP) - 管理 API(`/admin`)增删改 Client 与 scope - 多实例部署 / 集中缓存(Redis) - 审计异步落库与报表分析 - 限流参数热更新、复杂限流算法