1. 程式人生 > 實用技巧 >spring-cloud-gateway GlobalFilter 自定義鑑權失敗 返回資料結構

spring-cloud-gateway GlobalFilter 自定義鑑權失敗 返回資料結構

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結構如下