【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 # 資源服務器密鑰