1.1 模块概述
| 业务定位 | 开放银行平台的统一入口,负责路由转发、认证授权、限流熔断、日志记录、协议转换等跨切面关注点 |
| 技术实现 | Spring Cloud Gateway 2.1.1 + Spring Boot 2.1.3 + Sentinel 1.7.2 + OAuth2 2.3.5 |
| 监听端口 | 8188 |
| 核心组件 | GlobalFilter 链 / RouteService / DubboInvoke / AuthGlobalFilter / RateLimitGlobalFilter / TranLogFilter / IpBlacklistFilter |
| 完整度 | 完整(功能完善但存在安全风险) |
1.2 业务流程
flowchart TB
A["外部请求
HTTPS POST"] --> B{"路由匹配
Gateway Route"}
B -->|匹配成功| C["过滤器链执行
Order: -100 → 100"]
C --> C1["AuthGlobalFilter
OAuth2/H5/SDK 认证"]
C1 --> C2["RateLimitGlobalFilter
Sentinel 限流熔断"]
C2 --> C3["IpBlacklistFilter
IP 黑名单检查"]
C3 --> C4["TranLogFilter
交易日志记录"]
C4 --> D{目标服务类型}
D -->|Dubbo 服务| E["Dubbo RPC 调用
→ fop-platform-service"]
D -->|REST 服务| F["HTTP 调用
→ ijep-clouds-*"]
E --> G["BusinessOutput 返回"]
F --> G
G --> H["TranLogFilter 异步写日志"]
H --> I["JSON 响应返回"]
B -->|未匹配| J["404 Not Found"]
📌 业务逻辑详述
- 请求接收与路由匹配:API Gateway 监听 8188 端口,接收所有外部 HTTPS/HTTP 请求。请求到达后,Spring Cloud Gateway 根据 URL 路径匹配预配置的路由规则(RouteDefinition)。路由配置可从数据库动态加载(通过 RouteService 定时刷新),支持谓词匹配(Path/Method/Header/Query)和过滤器链。[B级: FopGatewayController.java]
- 认证授权(AuthGlobalFilter, order=-100):网关的第一道防线,根据请求特征自动识别三种认证模式:
• OAuth2 模式:检测 Authorization: Bearer {token} 头,调用 OAuth2 Server 校验 token 有效性、过期时间、scope 权限范围
• SDK 模式:检测 appKey/timestamp/sign 参数,从数据库查询 appSecret 后验签(HMAC-SHA256),校验时间戳防重放攻击(15分钟窗口)
• H5 模式:移动端 H5 场景的简易 Token 认证(降低集成复杂度)
认证失败直接返回 401/403 错误,不继续后续处理。[B级: AuthGlobalFilter.java]
- 限流熔断(RateLimitGlobalFilter, order=-50):通过 Alibaba Sentinel 实现多维度限流:
• 按 AppKey 维度:限制单个应用的 QPS(如 1000 次/秒)
• 按 API 维度:限制单个接口的并发数
• 按 IP 维度:限制单 IP 的请求频率(防爬/防 DDOS)
触发限流返回 429 Too Many Requests,触发熔断返回降级响应。[B级: RateLimitGlobalFilter.java]
- IP 黑名单检查(IpBlacklistFilter, order=0):查询 Redis 中的 IP 黑名单缓存(定时从数据库加载),若请求 IP 在黑名单中则直接拒绝返回 403 Forbidden。[B级: IpBlacklistFilter.java]
- 交易日志记录(TranLogFilter, order=100):在请求处理前后记录完整的交易日志,包括:请求头(Authorization/X-Forwarded-For/User-Agent)、请求体、请求时间戳、目标 API 路径、AppKey、开发者 ID、响应状态码、响应体、耗时毫秒数。日志异步写入 MySQL 和 Elasticsearch,用于审计追溯和问题排查。[B级: TranLogFilter.java ~400行]
- 后端服务调用:认证和限流通过后,根据路由配置将请求转发到后端服务:
• 若目标是 fop-parent 的 Dubbo Service → 通过 DubboInvoke 封装进行 RPC 调用,传入 DefaultDubboModel(包含 appId/tableName/sqlId/parameterList 等)
• 若目标是 ijep-clouds 微服务 → 通过 HTTP REST 调用[B级: FopGatewayController.java]
- 响应返回:后端服务返回 BusinessOutput 或标准 JSON 响应,网关统一封装为标准格式返回给调用方:
{
"code": "000000",
"message": "success",
"data": { ... },
"traceId": "xxxxxxxx",
"timestamp": 1716873600000
}
1.3 核心实体
FopRouteDefinition(路由定义)
| 字段 | 类型 | 业务含义 | 约束 |
| id | String | 路由唯一标识 | 主键 |
| uri | String | 目标服务 URI(lb://service-id 或 dubbo://service-name) | 必填 |
| predicates | List<PredicateDefinition> | 路由谓词(Path/Method/Header/Query 匹配条件) | 至少一个 |
| filters | List<FilterDefinition> | 路由过滤器(AddRequestHeader/StripPrefix 等) | 可选 |
| order | int | 排序(多个路由匹配时的优先级) | 默认 0 |
| metadata | Map | 扩展元数据(超时/重试策略) | 可选 |
FopRouteFluid(流量配置 - 灰度发布)
| 字段 | 类型 | 业务含义 |
| routeId | String | 关联的路由 ID |
| weight | int | 流量权重百分比(如 10 表示 10% 流量走新版本) |
| condition | String | 灰度条件(AppKey 白名单/IP 段/Header 匹配) |
| targetUri | String | 灰度目标 URI |
FopRouteFusing(熔断配置)
| 字段 | 类型 | 业务含义 |
| routeId | String | 关联的路由 ID |
| thresholdQps | double | QPS 阈值(超过则触发熔断) |
| thresholdErrorRate | double | 错误率阈值(如 0.5 = 50% 错误率触发熔断) |
| windowSeconds | int | 统计窗口时长(秒) |
| String | 降级响应内容(JSON 格式) |
1.4 业务规则
| 规则类型 | 规则描述 | 证据 |
| 认证模式自动识别 | 根据请求头/参数自动选择 OAuth2/H5/SDK 三种认证模式之一 | B级: AuthGlobalFilter.java |
| 签名验签 | SDK 模式下 HMAC-SHA256(appSecret, method+url+timestamp+body),时间差 >15min 拒绝 | B级: SdkAuthController.java |
| 限流维度 | 支持按 AppKey/API/IP 三维限流,使用 Sentinel 实时统计 | B级: RateLimitGlobalFilter.java |
| IP 黑名单 | Redis 缓存黑名单(TTL 5分钟),定时从数据库全量加载 | B级: IpBlacklistFilter.java |
| 日志全量记录 | 所有 API 请求/响应均记录,含请求头/体/耗时/状态码 | B级: TranLogFilter.java |
| 路由动态刷新 | 数据库路由变更后,Gateway 内存中的路由配置定时刷新(间隔可配) | B级: RouteService.java |
| ⚠️ 动态日志级别 | FopController.level() 接口可动态修改 Logback 日志级别(安全漏洞!) | B级: FopController.java [clouds] |
1.5 接口清单
| 操作 | URL | 方法 | 说明 |
| 动态路由转发 | /gateway/** | POST/GET | 核心入口,匹配所有未明确注册的路径 |
| 路由列表 | /route/list | GET | 查询当前生效的路由列表 |
| 刷新路由 | /route/refresh | POST | 手动触发从数据库重新加载路由 |
| H5 Token 获取 | /h5/auth/token | POST | H5 模式获取访问令牌 |
| SDK Sign 验证 | /sdk/auth/verify | POST | SDK 模式的签名验证测试 |
| ⚠️ 修改日志级别 | /fopservice/level | GET/POST | 动态修改 Logback 日志级别(应删除或加固) |
| 健康检查 | /actuator/health | GET | Spring Boot Actuator 健康端点 |
| 指标暴露 | /actuator/prometheus | GET | Prometheus 格式指标数据 |
1.6 已知缺陷
严重:FopController.level() 接口无权限控制即可修改 Logback 日志级别,可被利用提升日志级别到 DEBUG 泄露敏感信息(密码/密钥/Token),或关闭日志掩盖攻击痕迹。
高:AuthGlobalFilter 的异常处理不够精细,部分异常可能泄露内部栈信息。
高:TranLogFilter 记录了完整的 request body(可能包含用户敏感数据如密码/身份证号),缺少脱敏规则配置。
中:路由配置存储在 MySQL 中,若数据库不可用则无法启动新路由(虽有内存缓存但有最终一致性问题)。
2.1 模块概述
| 业务定位 | 管理 API 的全生命周期:注册 → 审核 → 发布 → 版本管理 → 下线归档 |
| 核心实体 | FopApiBookPo(API 信息表,系统最大表结构 ~350 行 PO) |
| 涉及角色 | API 提供者(银行内部)/ API 审核员(运营管理员)/ API 使用者(外部开发者) |
| 完整度 | 完整 |
2.2 业务流程
stateDiagram-v2
[*] --> 草稿: 创建 API\n(state=00)
草稿 --> 待审核: 提交审核\n(state=01)
待审核 --> 审核通过: 审核员批准\n(state=02)
待审核 --> 审核驳回: 审核员驳回\n(state=03)
审核驳回 --> 待审核: 修改后重新提交
审核通过 --> 已发布: 发布上线\n(state=04)
已发布 --> 新版本: 创建新版本\n(version++)
已发布 --> 已下线: 下线操作\n(state=05)
已下线 --> [*]
note right of 审核驳回
需填写驳回原因
通知 API 提供者修改
end note
📌 业务逻辑详述
- API 注册(创建草稿):API 提供者(通常是银行内部技术人员)在管理后台录入 API 基本信息:
• 基本信息:API 名称、英文名称、所属分类、描述
• 技术信息:请求路径(apiPath)、HTTP 方法(GET/POST/PUT/DELETE)、Content-Type、版本号(version,默认 v1.0)
• 请求参数:定义请求头(Headers)、路径参数(Path Variables)、查询参数(Query Params)、请求体(Body JSON Schema)
• 响应定义:响应码(成功/各错误码)、响应体结构(JSON Schema)、示例值
• 其他:调用示例代码(Java/Python/JavaScript/C# 等)、标签/分类、是否需要签名
系统自动赋值 state=00(草稿)、创建时间、创建人。[B级: FopApiBookPo.java ~350行]
- 提交审核:API 提供者确认信息无误后点击"提交审核",state 变更为 01(待审核)。系统通知运营管理员进行审核。[D级: 对标通用 API 管理流程]
- 审核(通过/驳回):运营管理员在管理后台查看待审核 API 列表,逐个审核:
• 审核要点:API 命名规范、路径唯一性(同版本内 apiPath 不可重复)、参数定义完整性、响应示例正确性、安全合规性(是否包含敏感字段、是否需要额外鉴权)
• 审核通过:state → 02(审核通过),记录审核人/审核时间
• 审核驳回:state → 03(审核驳回),必须填写驳回原因(如"路径不规范"/"参数缺失示例值"/"响应码不完整"),系统通知提供者修改
⚠️ 具体的审核校验规则代码层面未深入分析,以上为基于行业通用做法的推断。[D级]
- 发布上线:审核通过的 API 由运营管理员(或 API 提供者有权限时自行)执行发布操作,state → 04(已发布),记录发布时间/发布人。发布后 API 在开放门户前台对已授权的开发者可见并可调用。[D级]
- 版本管理:当 API 需要变更(新增参数/修改响应结构/变更业务逻辑)时,不允许直接修改已发布的版本,而是创建新版本(version 自增,如 v1.0 → v1.1 → v2.0)。新版本重新走"草稿→审核→发布"流程。旧版本可在过渡期并行运行一段时间后再下线。[B级: FopApiBookPo.version 字段]
- 下线归档:不再使用的 API 执行下线操作,state → 05(已下线)。下线后的 API 不再对外提供服务,已有调用方会收到"API 已下线"的错误提示。下线的 API 数据保留归档用于历史审计。[D级]
2.3 核心业务实体
FopApiBookPo(API 信息 - 核心表)
注:此表为系统中最大的表结构(PO 文件约 350 行),以下列出关键字段(其余约 100+ 字段涵盖详细的技术/业务/管理属性):
| 字段 | 类型 | 业务含义 | 约束 | 证据 |
| id | Long | API 主键ID | 自增主键 | A级 |
| apiName | String | API 中文名称 | 必填 | B级 |
| apiNameEn | String | API 英文名称 | 必填,用于生成路径 | B级 |
| apiPath | String | API 请求路径(如 /api/v2/user/info) | 同版本内唯一 | B级 |
| httpMethod | String | HTTP 方法(GET/POST/PUT/DELETE) | 枚举值 | B级 |
| version | String | 版本号(v1.0/v1.1/v2.0) | 默认 v1.0 | B级 |
| state | String | 状态(00草稿/01待审核/02通过/03驳回/04发布/05下线) | 状态机约束 | B级 |
| categoryId | Long | 所属分类ID(关联分类表) | 外键 | D级 |
| description | String | API 功能描述(Markdown 格式) | | B级 |
| requestExample | String | 请求示例(JSON 格式) | | B级 |
| responseExample | String | 响应示例(JSON 格式) | | B级 |
| rateLimit | Integer | 该 API 的单独限流阈值(QPS) | >0,覆盖全局默认 | B级 |
| needSign | Boolean | 是否需要 SDK 签名 | true/false | B级 |
| authType | String | 认证方式(OAuth2/H5/SDK/Public) | 枚举值 | B级 |
| creatorId | Long | 创建人(关联开发者/管理员) | 外键 | B级 |
| createTime | Date | 创建时间 | 自动赋值 | B级 |
| auditorId | Long | 审核人 | 审核时赋值 | B级 |
| auditTime | Date | 审核时间 | 审核时赋值 | B级 |
| publishTime | Date | 发布时间 | 发布时赋值 | D级 |
| offlineTime | Date | 下线时间 | 下线时赋值 | D级 |
| callCount | Long | 累计调用量(统计字段) | 自动累计 | D级 |
| successCount | Long | 成功调用量 | 自动累计 | D级 |
| failCount | Long | 失败调用量 | 自动累计 | D级 |
2.4 业务规则
| 规则类型 | 规则描述 | 证据 |
| 路径唯一性 | 同一 version 下 apiPath 不可重复,否则提示"API 路径已存在" | B级: API 录入校验逻辑 |
| 状态流转 | 严格按 00→01→02→04 或 00→01→03→01 分支流转,不可跳跃 | B级: 状态机设计 |
| 审核必填原因 | 驳回操作必须填写驳回原因,否则不允许提交 | D级: 通用审核流程 |
| 版本递增 | 新版本号必须大于当前最大版本号(字符串比较或语义化版本比较) | B级: version 字段约束 |
| 发布后不可编辑 | 已发布(state=04)的 API 不可再修改基础信息,只能创建新版本 | D级: 通用 API 管理原则 |
| 下线前通知 | ⚠️ 推断:下线操作应提前通知已接入的应用方(邮件/站内信),设置过渡期 | E级: 行业通用做法 |
| 统计数据 | 每次 API 调用成功/失败均更新 callCount/successCount/failCount(TranLogFilter 统计或定时聚合) | B级: TranLogFilter + 统计字段 |
2.5 接口与操作清单
| 操作 | URL | 方法 | 角色 | 说明 |
| API 列表查询 | /api/list | GET | 全部登录用户 | 分页查询,支持按名称/状态/版本筛选 |
| API 详情查看 | api/{id} | GET | 全部登录用户 | 查看完整 API 定义(含请求/响应示例) |
| 创建 API | /api/create | POST | API 提供者 | 新建 API 草稿 |
| 修改 API | /api/update/{id} | PUT | API 提供者/管理员 | 仅草稿/驳回状态可修改 |
| 提交审核 | /api/submit/{id} | POST | API 提供者 | 草稿→待审核 |
| 审核 API | /api/audit/{id} | POST | 运营管理员 | 通过或驳回(需填原因) |
| 发布 API | /api/publish/{id} | POST | 运营管理员 | 审核通过→已发布 |
| 下线 API | /api/offline/{id} | POST | 运营管理员 | 已发布→已下线 |
| 创建新版本 | /api/version/{id} | POST | API 提供者 | 基于当前版本复制并自增版本号 |
| API 统计 | /api/stats/{id} | GET | API 提供者/管理员 | 调用量/成功率/平均响应时间 |
2.6 跨模块依赖
flowchart LR
AM["API 管理"] -->|apiId 引用| APP["应用接入管理"]
AM -->|creatorId| DEV["开发者管理"]
AM -->|categoryId| CAT["分类管理"]
AM -->|审核流程| BPM["BPM 工作流"]
AM -.->|统计数据| LOG["日志审计模块"]
2.7 已知缺陷
高:FopApiBookPo 实体过大(~350行/100+字段),可能存在字段冗余或未使用字段,增加维护难度。
中:API 审核流程缺少自动化校验工具(如自动检测路径冲突/Schema 合法性/示例格式),完全依赖人工审核效率低且易遗漏。
3.1 模块概述
| 业务定位 | 管理第三方开发者的应用接入全生命周期:创建 → 审核 → 密钥分配 → 权限配置 → 调用统计 → 计费结算 |
| 核心实体 | FopAppBookPo(应用信息)+ TokenPo(令牌) |
| 涉及角色 | 开发者(应用创建者)/ 运营管理员(审核者/权限分配者) |
| 完整度 | 完整 |
3.2 业务流程
flowchart TB
subgraph 应用生命周期
A1["开发者 创建应用
填写基本信息"] --> A2["待审核
state=01"]
A2 -->|运营审核通过| A3["审核通过
state=02
自动分配 appKey/appSecret"]
A2 -->|审核驳回| A4["驳回
state=05
需修改后重新提交"]
A4 --> A1
A3 --> A5["正常运行
state=03
可调用授权的 API"]
A5 -->|申请更多 API 权限| A6["权限变更
重新审核"]
A6 --> A2
A5 -->|主动注销/违规冻结| A7["冻结/注销
state=04"]
end
📌 业务逻辑详述
- 创建应用:开发者在 openportal 开放门户或 jepWeb 管理后台创建新应用,填写:
• 应用名称(如"XX 支付小程序")
• 应用类型(Web/App/H5/Server-to-Server)
&td;• 应用描述(用途说明)
• 回调地址(OAuth2 授权回调 URL,用于接收授权码)
• 应用图标/Logo(上传到 FastDFS)
• 联系人和联系电话
创建后 state=00(待提交),开发者可随时编辑。[B级: FopAppBookPo.java]
- 提交审核:开发者确认应用信息无误后提交审核,state→01(待审核)。系统通知运营管理员。
- 运营审核:运营管理员审核应用:
• 审核要点:应用名称是否规范(不得包含违禁词/银行品牌词)、回调地址是否合法(不得是内网 IP/localhost)、应用类型与回调地址是否匹配、开发者资质是否满足(实名认证状态)
• 通过:state→02(审核通过),系统自动生成:
- appKey(应用标识,公开,用于标识调用方身份)
- appSecret(应用密钥,仅显示一次!用于 SDK 签名计算 HMAC)
⚠️ appSecret 安全策略:首次生成后明文展示一次,之后无法再次查看(只能重置)。重置后旧 secret 立即失效。
• 驳回:state→05(驳回),需填写驳回原因[B级: FopAppBookPo.java + TokenPo.java]
- 配置 API 权限:审核通过后,开发者可为应用申请调用特定 API 的权限(Scope)。运营管理员也可批量授权常用 API 权限。权限粒度:
• API 级别:允许调用哪些 API(如 user.info / payment.create / account.query)
• 操作级别:对该 API 可执行哪些操作(读/写/全部)
权限变更需要重新审核(防止滥用)[D级: RBAC 权限模型推断]
- 调用 API:应用获得 appKey/appSecret 并被授权 API Scope 后,即可开始调用:
1. 使用 appSecret + 时间戳 + 请求内容计算 sign 签名
2. 将 appKey/timestamp/sign 附加到请求头或参数
3. 发送请求到 API Gateway :8188
4. Gateway 验签通过后检查 appKey 对应的 app 是否正常(state=03)、是否有目标 API 的 scope 权限
5. 全部通过后转发到后端服务执行
6. 返回结果[B级: SdkAuthController + AuthGlobalFilter]
- 应用管理:开发者可在控制台查看:
• 应用基本信息和 appKey
• 已授权的 API 列表和 Scope
• 调用统计(今日/本周/本月调用量、成功率、平均响应时间)
• 计费信息(调用量套餐/费用明细/账单)
• 重置 appSecret(立即生效,旧 Secret 失效,需同步更新所有调用方配置)⚠️
3.3 核心业务实体
FopAppBookPo(应用信息)
| 字段 | 类型 | 业务含义 | 约束 |
| id | Long | 应用主键 | 自增主键 |
| appName | String | 应用名称 | 必填,唯一(同一开发者下) |
| appType | String | 应用类型(Web/App/H5/Server) | 枚举 |
| appKey | String | 应用标识(审核通过后自动生成) | 全局唯一,不可修改 |
| appSecret | String | 应用密钥(加密存储,仅首次可见) | 哈希存储(不可逆) |
| callbackUrl | String | OAuth2 回调地址 | 合法 URL 格式 |
| iconUrl | String | 应用图标(FastDFS URL) | |
| description | String | 应用描述 | |
| state | String | 状态(00待提交/01待审核/02通过/03正常/04冻结/05驳回) | 状态机 |
| developerId | Long | 所属开发者ID | 外键 → DeveloperInfo |
| scopes | String | 已授权的 API 权限列表(逗号分隔或 JSON 数组) | |
| rateLimit | Integer | 应用级别的 QPS 限制 | 覆盖全局默认 |
| dailyCallLimit | Integer | 每日最大调用量 | =0 表示不限 |
| monthlyCallLimit | Integer | 每月最大调用量 | =0 表示不限 |
| createTime | Date | 创建时间 | 自动 |
| auditTime | Date | 审核时间 | 审核时 |
| freezeReason | String | 冻结原因(违规/逾期/主动注销) | 冻结时 |
3.4 业务规则
| 规则类型 | 规则描述 | 证据 |
| 应用名称唯一 | 同一开发者下 appName 不可重复 | B级: 创建校验逻辑 |
| AppKey 全局唯一 | 系统生成的 appKey 全局不可重复(UUID 或自定义编码规则) | B级: SequenceUtils/IdWorker |
| AppSecret 仅展示一次 | 首次生成后明文展示,之后无法查看(只可重置) | B级: 安全通用实践 |
| CallbackUrl 合法性 | 必须是公网可访问的 HTTPS 地址(禁止 localhost/127.0.0.1/内网IP) | D级: 安全通用要求 |
| Scope 权限最小化 | 应用仅能调用已被显式授权的 API(Scope),默认无任何权限 | B级: OAuth2 Scope 模型 |
| 调用量限制 | 支持日/月两级调用量限制,超出后返回 429 并提示联系运营 | B级: dailyCallLimit/monthlyCallLimit |
| 重置 Secret 生效 | 重置 appSecret 后立即生效(无需等待),旧 Secret 同时失效 | D级: 安全通用实践 |
| 冻结恢复 | 被冻结的应用需联系运营管理员解除冻结,不能自助解冻 | D级: 安全管控要求 |
3.5 已知缺陷
高:⚠️ 推断——应用审核可能缺少自动化资质检查(如开发者是否已完成实名认证、企业用户是否已上传营业执照),纯靠人工审核易遗漏。
中:⚠️ 推断——权限变更(新增/撤销 API Scope)的流程可能不够完善,缺少变更影响评估(哪些应用会受影响)。
4.1 模块概述
| 业务定位 | 管理开放平台的注册用户(开发者):注册 → 实名认证 → 登录 → 权限管理 → 社区互动 |
| 核心实体 | FopDeveloperInfoPo(开发者信息) |
| 认证方式 | Portal: Shiro + OAuth2 / 前台: JWT Token |
| 完整度 | 完整 |
4.2 业务流程
flowchart LR
R["注册账号
手机号/邮箱+密码"] --> V["验证
验证码/邮箱验证"]
V --> L["实名认证
个人:身份证
企业:营业执照"]
L -->|认证通过| D["正常开发者
可创建应用/调用API"]
D --> LOGIN["登录
Shiro/OAuth2/JWT"]
LOGIN --> USE["使用平台功能
创建应用/查看API/沙箱测试/社区互动"]
📌 业务逻辑详述
- 注册:开发者在 openportal 开放门户首页点击"注册",填写:
• 手机号或邮箱(作为登录账号)
 • 登录密码(前端 AES 加密传输)
• 确认密码
• 图形验证码(Kaptcha 生成,防机器人注册)
• 用户协议勾选(必须同意《开放平台服务协议》)
提交后 Portal 后端 ShiroService 通过 Dubbo 调用后端创建账户。[B级: fop-portal RequestController.regist()]
- 登录:
• Portal 登录:用户名 + 密码(AES 加密)→ Shiro OAuth2Filter 拦截 → OAuth2Realm 验证 → Redis Session 存储(30分钟超时)→ 设置 Cookie
• 前台 AJAX 登录:Vue 前端 Axios POST /login → 后端校验 → 返回 JWT Token → Vuex 存储 → Axios 拦截器自动附加 Token 到后续请求 Header[B级: ShiroConfig + OAuth2Realm]
- 实名认证:注册后需完成实名认证才能创建应用和调用生产环境 API(沙箱环境可能不需要):
• 个人开发者:真实姓名 + 身份证号 + 身份证正反面照片(上传 FastDFS)
• 企业开发者:企业名称 + 统一社会信用代码 + 营业执照照片 + 法人信息
⚠️ 具体的实名认证对接方式(人工审核/三方自动核验?)代码层面未明确发现,需进一步确认。[D级]
- 权限管理:基于 RBAC 模型:
• 默认角色:普通开发者(可浏览 API 市场、查看文档、使用沙箱)
• 高级角色:认证开发者(可创建应用、调用生产 API)— 需实名认证
• 特殊角色:合作机构(享有更高的调用量限额和优先支持)[B级: RBAC 权限模型]
4.3 已知缺陷
高:Portal 密码使用 MD5 哈希(推测,基于 Shiro 1.3.2 默认配置),迭代次数可能不足(建议 ≥1000 次或使用 bcrypt)。
中:缺少登录失败锁定机制(或配置较弱),存在暴力破解风险。