【Springcloud】gateway增加fliter

该篇文章介绍了如何在网关层面上实现公司需求,通过`PreLicenseRequestFilter`过滤器检查请求是否具有有效的许可证,并进行授权校验和解密,确保只有授权用户能访问特定资源。
摘要由CSDN通过智能技术生成

公司需求增加License功能,在网关层面统一校验放行

@Slf4j
@Component
@RequiredArgsConstructor
public class PreLicenseRequestFilter implements GlobalFilter, Ordered {

    // 是否开启授权
    private final Boolean Liscence = true;

    private static final String[] IGNORE_PRAMS = new String[]{"lmcSysLicense"};

    private final String LicenseKey = "LicenseKey";


    @Autowired
    private RedisService redisService;





    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), IGNORE_PRAMS)) {
            ServerHttpResponse response = exchange.getResponse();
            if (!Liscence) {
                return chain.filter(exchange);
            }

            // 判断是否有LicenseKey
            Boolean b = redisService.hasKey(LicenseKey);
            if (!b) {
                return ResponseUtil.webFluxResponseWriter(response, CommonConstant.JSON_UTF8, HttpStatus.UNAUTHORIZED, "未授权不能操作,请联系客服!");
            }
            String json = redisService.get(LicenseKey).toString();
            LmcLicenseVo lmcLicenseVo = JSONObject.parseObject(json, LmcLicenseVo.class);
            try  {
                String license = getLicense(lmcLicenseVo.getLicenseStr(), lmcLicenseVo.getPrivateKey());
                log.info("license----" , license);
                // 判断授权是否到时间
                LmcSysLicenseVo lmcSysLicenseVo = JSONObject.parseObject(license, LmcSysLicenseVo.class);
                if (Objects.isNull(lmcSysLicenseVo)) {
                    return ResponseUtil.webFluxResponseWriter(response, CommonConstant.JSON_UTF8, HttpStatus.UNAUTHORIZED, "未授权不能操作,请联系客服!");
                }
                if (lmcSysLicenseVo.getEndTime().isBefore(LocalDate.now())) {
                    return ResponseUtil.webFluxResponseWriter(response, CommonConstant.JSON_UTF8, HttpStatus.UNAUTHORIZED, "授权已到期不能操作,请联系客服!");
                }
            } catch (Exception e) {
                log.error("解析授权信息异常:"+e.getMessage());
                return ResponseUtil.webFluxResponseWriter(response, CommonConstant.JSON_UTF8, HttpStatus.UNAUTHORIZED, "授权查询异常,请联系客服!");
            }

        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }


    // 解密工具
    public static String getLicense(String licenseStr , String privateKey) {
        RSA rsa = new RSA(privateKey, null);
        byte[] decrypt = rsa.decrypt(HexUtil.decodeHex(licenseStr), KeyType.PrivateKey);
        //非对称解密
        String s = HexUtil.encodeHexStr(decrypt);
        // 对称解密
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, CommonConstant.PASSWORD_SECURITY_KEY.getBytes());
        return aes.decryptStr(s, CharsetUtil.CHARSET_UTF_8);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值