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结构如下