spring-cloud-gateway GlobalFilter 自定義鑑權失敗 返回資料結構
阿新 • • 發佈:2021-01-17
1、 在使用spring-cloud-gateway 攔截鑑權的時候的時候,錯誤一般返回401。
我們該如果自定義自己的返回許可權呢。圖中紅色部分就是自定義鑑權失敗返回資料結構。
@Configuration @ComponentScan(basePackages = "com.xx.test") @Slf4j public class GateWayFiler implements GlobalFilter { /** * 1.首先閘道器檢查token是否有效,無效返回自定資料結構 * 2.呼叫籤權伺服器看是否對該請求有許可權,有許可權進入下一個filter,無效返回自定資料結構 * @param exchange * @param chain * @return */ @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String url = request.getPath().value(); //不需要閘道器籤權的url if (url.contains("/auth")) { return chain.filter(exchange); } if(hasPower()){ //TODO } return noPower(exchange);} /** * 判斷是否有許可權 * @return */ private boolean hasPower(){ return false; } /** * 閘道器拒絕,返回Result * * @param */ private Mono<Void> noPower(ServerWebExchange serverWebExchange) { // 許可權不夠攔截 serverWebExchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); Result data = Result.fail(SystemErrorType.NO_POWER); DataBuffer buffer = serverWebExchange.getResponse().bufferFactory().wrap(JSON.toJSONString(data).getBytes(StandardCharsets.UTF_8)); ServerHttpResponse response = serverWebExchange.getResponse(); response.setStatusCode(HttpStatus.UNAUTHORIZED); //指定編碼,否則在瀏覽器中會中文亂碼 response.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); return response.writeWith(Mono.just(buffer)); }} Result結構如下