
在微服务化改造中,细粒度权限(如基于角色、权限及属性的访问控制)应由各资源服务器自主校验;API 网关仅负责统一认证、令牌透传与客户端适配,避免安全逻辑集中化导致耦合与可维护性下降。
在微服务架构中,细粒度权限校验应在资源服务器而非 api 网关执行;api 网关仅负责统一认证、令牌透传与客户端适配,避免安全逻辑集中化导致耦合与可维护性下降。
权限校验的责任边界:资源服务器是唯一可信执行点
细粒度授权(Fine-Grained Authorization)——例如“用户是否具备对某订单执行‘退款审核’操作的权限,且该权限受限于所属部门和时间窗口”——本质上属于业务上下文强相关的逻辑。它随业务规则频繁演进,且不同微服务的数据模型、权限语义和策略引擎往往差异显著(如订单服务依赖组织架构,报表服务依赖数据分级标签)。因此,最佳实践是将权限决策完全下放到各资源服务器内部实现,而非在 API 网关统一拦截。
网关的核心职责是认证(Authentication)与协议转换,而非授权(Authorization):
- ✅ 验证
accessToken的签名、有效期、颁发者(issuer)和受众(audience); - ✅ 解析并透传令牌(如通过
Token Relay将原始accessToken注入下游请求头); - ✅ 对 Web 客户端做额外防护(如解析 Secure Cookie、校验 CSRF Token、处理 CORS 头);
- ❌ 不应解析权限声明(如
authorities)、不应对scope或自定义 claim 做业务级判断(如 “是否含order:refund:approve权限”)。
? 关键原则:网关保障“你是谁”,资源服务器决定“你能做什么”。
如何让资源服务器获取完整权限上下文?
既然网关只透传 accessToken,资源服务器如何获得所需的用户身份、角色与权限?答案是:将必要授权信息以标准或扩展声明(claims)嵌入 accessToken,由授权服务器(AS)在签发时注入。
例如,在 OAuth 2.1 / OIDC 流程中,授权服务器可在签发 accessToken 时包含以下 claims:
{
"sub": "user-123",
"scope": "api:read api:write",
"roles": ["admin", "finance-auditor"],
"permissions": ["order:refund:approve", "report:export:pdf"],
"dept_id": "FIN-001",
"allowed_regions": ["CN", "SG"]
}
资源服务(如 Spring Boot 微服务)可通过如下方式安全使用这些声明:
// 示例:基于 JWT claim 的权限检查(Spring Security + JWT)
@PreAuthorize("hasAuthority('order:refund:approve') && #order.deptId == principal.claims['dept_id']")
public void approveRefund(Order order) {
// 执行退款审核逻辑
}
⚠️ 注意事项:
- 绝不信任网关传递的
authorities字段:若网关从 session cookie 中提取并伪造authorities,会破坏零信任原则;- 令牌应由 AS 签发并签名:资源服务器通过公钥验证 JWT 完整性,确保
roles/permissions等声明未被篡改;- 敏感属性需最小化暴露:避免在
accessToken中携带 PII(如邮箱、手机号),可改用id_token或调用 UserInfo Endpoint 获取。
为什么不应在网关触发 OIDC 授权码流程?
问题中提到网关主动执行 authorization code flow 并携带 openid scope,这是典型的反模式:
- ❌ 破坏客户端自治性:SPA、移动端 App、第三方系统等非浏览器客户端无法处理重定向响应,网关发起的重定向会导致 Ajax 请求失败或 iframe 跨域异常;
- ❌ 混淆认证主体:网关作为中间层不应代表用户向 AS 发起登录,这违背 OAuth 2.1 的“client-directed authorization”原则;
- ❌ 增加单点故障与延迟:每次 API 请求都可能触发完整 OIDC 流程,严重拖慢性能。
✅ 正确做法是:每个前端客户端(Web SPA、Mobile App、CLI)独立完成自己的 OIDC 登录流程,获取 accessToken 后直接调用 API。网关只需无状态地验证并转发该令牌。
| 客户端类型 | 推荐模式 | 网关角色 |
|---|---|---|
| Web SPA | PKCE + Authorization Code Flow | 透传 accessToken,校验 JWT |
| 移动 App | PKCE 或 Device Code Flow | 同上 |
| Backend-for-Frontend (BFF) | Authorization Code Flow(服务端渲染场景) | BFF 是客户端,网关仍是透明代理 |
? 补充价值点:
openidscope 仅在需要获取用户身份标识(如sub,name)时由前端客户端申请,用于 UI 展示或用户会话管理;资源服务器通常无需id_token,仅需access_token中的授权声明。
总结:构建可演进的安全分层架构
| 层级 | 职责 | 技术实现建议 |
|---|---|---|
| API 网关 | 认证入口、令牌透传、CSRF/CORS、客户端适配 | Kong / Apigee / Spring Cloud Gateway + JWT Filter |
| 资源服务器 | 细粒度授权、业务策略执行、权限缓存 | Spring Security + @PreAuthorize / Casbin / OPAL |
| 授权服务器(AS) | 签发含业务声明的 accessToken,管理权限映射 |
Keycloak / Auth0 / Custom AS with RBAC/ABAC rules |
最终目标是实现:网关稳定少变、服务自治演进、安全策略贴近业务。当权限规则调整时,只需更新对应微服务的策略配置或代码,无需协调网关团队发布,大幅提升迭代效率与系统韧性。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











