【GateWay】网关详解和权限验证
- 一、Gateway 核心概念与架构
- 二、路由断言(Route Predicates)详解
- 三、过滤器(Filters)机制
- 四、权限认证的核心理论模型
- 五、Spring Cloud Gateway + Security + OAuth2 集成方案
- 六、OAuth2.0 集成
一、Gateway 核心概念与架构
Spring Cloud Gateway 是基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 构建的响应式 API 网关,核心功能包括:
- 路由转发:根据请求条件将请求转发到不同微服务
- 请求过滤:在请求或响应处理过程中添加自定义逻辑
- 动态路由:结合服务注册中心实现路由配置动态更新
- 流量控制:支持限流、熔断等服务保护机制
其架构基于 Reactor 响应式编程模型,采用非阻塞 IO,相比传统阻塞式网关(如 Zuul 1.x)具有更高的并发处理能力。
二、路由断言(Route Predicates)详解
1. 路由断言的本质
路由断言是 Gateway 用于匹配请求的条件表达式,通过一组预定义的谓词(Predicate)判断请求是否符合路由规则。
每个路由至少包含一个断言,当请求满足所有断言时,才会被转发到目标服务。
2. 常用路由断言谓词
断言类型 | 作用描述 | 配置示例 |
---|---|---|
Path | 匹配请求路径模式 | Path=/user-service/** |
Method | 匹配 HTTP 请求方法(GET、POST 等) | Method=GET |
Header | 匹配请求头中的参数 | Header=X-Request-Id, \d+ |
Query | 匹配请求参数 | Query=name, Jack |
Cookie | 匹配请求 Cookie | Cookie=JSESSIONID, [a-z0-9]+ |
Host | 匹配请求 Host 头 | Host=**.example.com |
RemoteAddr | 匹配客户端 | IP 地址 RemoteAddr=192.168.1.1/24 |
TimeBetween | 匹配请求时间范围 | TimeBetween=8:00-18:00 |
Weight | 权重路由(配合负载均衡) | Weight=group1, 80 |
3. 断言组合与优先级
- 组合方式:多个断言通过 AND 逻辑组合(需同时满足),例如:
- 优先级:路由配置的顺序决定断言匹配优先级,先匹配的路由优先处理
- Path=/api/user/** AND Method=GET
4. 自定义断言
若需扩展断言逻辑,可实现 GatewayPredicateFactory 接口,例如:
public class CustomPredicateFactory extends AbstractGatewayPredicateFactory<CustomPredicateFactory.Config> {public CustomPredicateFactory() {super(Config.class);}@Overridepublic GatewayPredicate apply(Config config) {return (exchange, chain) -> {// 自定义断言逻辑(如请求参数校验、用户身份验证等)return chain.filter(exchange);};}public static class Config {// 断言配置参数}
}
三、过滤器(Filters)机制
1. 过滤器分类
Gateway 过滤器分为两类:
- 内置过滤器:Gateway 自带的功能过滤器,覆盖常见需求
- 自定义过滤器:用户根据业务需求自定义的过滤器
2. 核心内置过滤器
过滤器类型 | 作用描述 | 配置示例 |
---|---|---|
RewritePath | 重写请求路径 | RewritePath=/api/(?.*), /${segment} |
Retry | 请求重试机制 | Retry=3, BAD_GATEWAY, 1000 |
Hystrix | 集成 Hystrix 熔断 | Hystrix=myCommand |
RequestRateLimiter | 请求限流(基于 Redis) | RequestRateLimiter=10, 20, 100 |
CircuitBreaker 熔断处理 | (支持 Sentinel 等) | CircuitBreaker=mybreaker |
ResponseHeader | 修改响应头 | ResponseHeader=X-Result, Success |
RequestHeader | 修改请求头 | RequestHeader=X-User, ${user} |
3. 过滤器执行流程
- Pre 过滤器:在请求转发到目标服务前执行(如权限验证、参数校验)
- Post 过滤器:在目标服务响应后执行(如结果转换、响应头添加)
- 执行顺序:过滤器按配置顺序执行,可通过 order() 方法指定优先级
4. 自定义过滤器实现
@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 从请求中获取令牌String token = exchange.getRequest().getHeaders().getFirst("Authorization");// 2. 令牌验证逻辑if (token == null || !validateToken(token)) {ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}// 3. 验证通过,放行请求return chain.filter(exchange);}@Overridepublic int getOrder() {return 0; // 过滤器优先级,数值越小优先级越高}private boolean validateToken(String token) {// 令牌验证逻辑(可对接 OAuth2、JWT 等)return true;}
}
四、权限认证的核心理论模型
在微服务架构中,权限认证遵循 “认证(Authentication)+ 授权(Authorization)” 分离的原则:
- 认证(Authentication)
验证用户身份的合法性,常见方式:
- 用户名 / 密码
- Token(如 JWT、OAuth2 Access Token)
- 生物特征(指纹、人脸等)
- 授权(Authorization)
验证用户是否有权限访问特定资源,基于:
- 角色(Role):如 ADMIN、USER
- 权限(Permission):如 USER_CREATE、ORDER_VIEW
- 属性(Attribute):如用户部门、地域
- OAuth2.0 协议模型
- 资源所有者(Resource Owner):用户
- 客户端(Client):前端应用或第三方服务
- 授权服务器(Authorization Server):颁发令牌
- 资源服务器(Resource Server):保护受保护资源
- JWT 令牌结构
JWT 由三部分组成:
Header.Payload.Signature
头部 . 有效载荷 . 签名
- Header:包含令牌类型和签名算法
- Payload:包含声明(Claims),如用户 ID、角色、过期时间
- Signature:使用密钥对 Header 和 Payload 签名生成
五、Spring Cloud Gateway + Security + OAuth2 集成方案
┌─────────────────────────────────────────────────────────┐
│ 客户端请求 │
└───────────────────────┬─────────────────────────────────┘│▼
┌─────────────────────────────────────────────────────────┐
│ Spring Cloud Gateway │
│ ┌─────────────────────────────────────────────────────┐│
│ │ Security 过滤器链 ││
│ │ ┌───────────┐ ┌───────────┐ ┌──────────────────┐ ││
│ │ │ 认证过滤器 │→│ 授权过滤器 │→│ OAuth2资源服务器过滤器 │ │
│ │ └───────────┘ └───────────┘ └──────────────────┘ ││
│ └─────────────────────────────────────────────────────┘│
└───────────────────────┬─────────────────────────────────┘│▼
┌─────────────────────────────────────────────────────────┐
│ 下游微服务集群 │
└─────────────────────────────────────────────────────────┘
六、OAuth2.0 集成
1. OAuth2 授权模式选择
模式 | 适用场景 | 安全性 |
---|---|---|
授权码模式 (Authorization Code) | 服务端应用(如 Web 应用) | 最高 |
简化模式 (Implicit) | 前端应用(如 SPA) | 中等 |
密码模式 (Resource Owner Password Credentials) | 受信任的第一方应用 | 中等 |
客户端模式 (Client Credentials) | 服务间调用 | 高 |
2. 资源服务器配置
spring:security:oauth2:resourceserver:jwt:issuer-uri: http://auth-server:8080 # 授权服务器URLjwk-set-uri: http://auth-server:8080/oauth2/jwks # JWK集合URL
3. 令牌自省(Token Introspection)
当使用 opaque token(非 JWT)时,需配置令牌自省端点:
spring:security:oauth2:resourceserver:introspection-uri: http://auth-server:8080/oauth2/introspect # 自省端点client-id: resource-server # 资源服务器IDclient-secret: secret # 资源服务器密钥