全局過濾器
- 全局過濾器作用于所有路由,無需配置会宪。通過全局過濾器可以實(shí)現(xiàn)對權(quán)限的統(tǒng)一校驗(yàn)肖卧,安全性驗(yàn)證等功能。
內(nèi)置全局過濾器
-
SpringCloudGateway內(nèi)部也是通過一系列的內(nèi)置過濾器對整個路由轉(zhuǎn)發(fā)進(jìn)行如下處理:
image
自定義全局過濾器
- 內(nèi)置的過濾器已經(jīng)可以完成大部分的功能掸鹅,但是對于企業(yè)開發(fā)的一些業(yè)務(wù)功能處理塞帐,還是需要我們自己編寫過濾器來實(shí)現(xiàn)的,那么我們一起通過代碼的形式自定義一個過濾器巍沙,去完成統(tǒng)一的權(quán)限校驗(yàn)葵姥。
- 開發(fā)中鑒權(quán)邏輯:
- 當(dāng)客戶端第一次請求服務(wù)時,服務(wù)端對用戶進(jìn)行信息認(rèn)證(登錄)
- 認(rèn)證通過句携,將用戶信息進(jìn)行加密形成token榔幸,返回客戶端,作為登錄憑證
- 以后每次請求矮嫉,客戶端都攜帶認(rèn)證的token
-
服務(wù)端對token進(jìn)行解密削咆,判斷是否有效。
image
- 如上圖蠢笋,對驗(yàn)證用戶是否已經(jīng)登錄鑒權(quán)的過程可以在網(wǎng)關(guān)統(tǒng)一校驗(yàn)拨齐。
- 校驗(yàn)的標(biāo)準(zhǔn)就是請求中是否攜帶token憑證以及token的正確性。
- 下面的我們自定義一個GolbalFilter昨寞,去校驗(yàn)所有請求的請求參數(shù)中是否包含”token“瞻惋,如何步包含請求參數(shù)“token”則不轉(zhuǎn)發(fā)路由厦滤,否則執(zhí)行正常的邏輯。
/**
* 自定義全局過濾器(作用 統(tǒng)一鑒權(quán))
* 要求:必須實(shí)現(xiàn)GlobalFilter, Ordered并且實(shí)現(xiàn)里面的兩個方法
*/
@Slf4j
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
/**
* 過濾器邏輯
* @param exchange
* @param chain
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//統(tǒng)一鑒權(quán)邏輯
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (!StringUtils.pathEquals("admin",token)){
//認(rèn)證失敗
log.info("認(rèn)證失敗了...");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
//放行
return chain.filter(exchange);
}
/**
* 標(biāo)識當(dāng)前過濾器的唯一標(biāo)識歼狼,返回值越小馁害,優(yōu)先級越高
* @return
*/
@Override
public int getOrder() {
return 0;
}
}