統一鑒權
內置的過濾器已經可以完成大部分的功能,但是對於企業開發的一些業務功能處理,還是需要我們自己編寫過濾器來實現的,那么我們一起通過代碼的形式自定義一個過濾器,去完成統一的權限校驗。
鑒權邏輯
開發中的鑒權邏輯:
當客戶端第一次請求服務時,服務端對用戶進行信息認證(登錄)
認證通過,將用戶信息進行加密形成token,返回給客戶端,作為登錄憑證
以后每次請求,客戶端都攜帶認證的token
服務端對token進行解密,判斷是否有效。

如上圖,對於驗證用戶是否已經登錄鑒權的過程可以在網關層統一檢驗。檢驗的標准就是請求中是否攜帶token憑證以及token的正確性。
代碼實現
下面的我們自定義一個GlobalFilter,去校驗所有請求的請求參數中是否包含“token”,如何不包含請求參數“token”則不轉發路由,否則執行正常的邏輯。
@Component public class AuthorizeFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //String url = exchange.getRequest().getURI().getPath(); //忽略以下url請求 //if(url.indexOf("/login") >= 0){ // return chain.filter(exchange); // } String token = exchange.getRequest().getQueryParams().getFirst("token"); if (StringUtils.isBlank(token)) { log.info( "token is empty ..." ); exchange.getResponse().setStatusCode( HttpStatus.UNAUTHORIZED ); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return 0; } }
自定義全局過濾器需要實現GlobalFilter和Ordered接口。
在fifilter方法中完成過濾器的邏輯判斷處理
在getOrder方法指定此過濾器的優先級,返回值越大級別越低
ServerWebExchange 就相當於當前請求和響應的上下文,存放着重要的請求-響應屬性、請求實例和響應實例等等。一個請求中的request,response都可以通過 ServerWebExchange 獲取
調用 chain.filter 繼續向下游執行