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