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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值