spring cloud gateway 权限校验

  • 编写自定义的权限校验代码,并且使该过滤器在指定的路由上生效即可
  • 如果权限校验需要使用到redis,则在gateway中需要引入redis的依赖
自定义token权限校验代码
/**
 * @calssName AppTokenFilter
 * @Description 验证路由到APP用户端的接口是否有token
 * @Author jiangshaoneng
 * @DATE 2020/9/25 14:39
 */
public class AppTokenFilter implements GatewayFilter, Ordered {

    private static final Logger logger = LoggerFactory.getLogger(AppTokenFilter.class);

    private int order;

    private TokenRedis tokenRedis;

    private static final List<String> NO_FILTER_PATHS = new ArrayList<>();
    static{
        NO_FILTER_PATHS.add("/game-app-server-api/api/v1/account/register/rapid");         // 快速注册
        NO_FILTER_PATHS.add("/game-app-server-api/api/v1/account/register/mobile");        // 手机注册
        NO_FILTER_PATHS.add("/game-app-server-api/api/v1/account/login/account");          // 账号登录
        NO_FILTER_PATHS.add("/game-app-server-api/api/v1/account/login/mobile");           // 手机登录
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        logger.info("AppTokenFilter ...");

        // 获取请求地址
        PathContainer pathContainer = exchange.getRequest().getPath().pathWithinApplication();
        String path = pathContainer.toString();

        if(NO_FILTER_PATHS.contains(path)){
            // 无需限制的地址,继续执行
            return chain.filter(exchange);
        }

        // 加载bean对象
        if(tokenRedis == null){
            tokenRedis = SpringUtils.getBean(TokenRedis.class);
        }

        // 获取token
        List<String> headers = exchange.getRequest().getHeaders().get("token");
        String token = headers != null ? headers.get(0) : "";
        logger.info(">>>>>>> token:{} >>>>>>>>", token);

        // 通过token获取redis中对应adminId
        UserInfoBo u = tokenRedis.getUserInfoByToken(token);
        logger.info(">>>>>>> userId:{} >>>>>>>>", u != null ? u.getUserId() : null);

        if(u == null){
            // 返回未登录得提示信息
            return exchange.getResponse().writeWith(Flux.just(exchange.getResponse()
                    .bufferFactory().wrap(JsonUtils.Object2Json(R.error(ErrorCode.SYS_USER_NOT_LOGIN)).getBytes())) );
        }else{
            // 继续执行 todo 这里暂时无法向请求中设置参数;如: req.setAttribute("userId",  u.getUserId());
            return chain.filter(exchange);
        }
    }

    @Override
    public int getOrder() {
        return this.order;
    }

    public AppTokenFilter(int order){
        this.order = order;
    }
}
配置自定义的ApptokenFilter到指定的路由上
@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator appRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route(r -> r.path("/game-app-server-api/api/**")
                .filters(f -> f.filter(new AppTokenFilter(-10))) // 此处的顺序需要根据具体项目而定。通常会在跨域,日志,解密等过滤器后面
                    .uri("lb://game-app-server-api")
                    .id("game-app-server-api")
                ).build();
    }
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放码过来_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值