• sign鉴权前置到网关,看看shenyu怎么处理


    前言


    shenyu以前叫soul网关,我比较早关注它的,直到前不久看到它们创始人发的朋友圈,才知道现在已经是apache顶级项目了,666

    今天我点了下shenyu issue里头逛逛,发现了一个老哥说能否做到对签名插件的扩展,然后我就去看了shenyu里头怎么实现验签的

    • https://github.com/apache/shenyu/pull/3637

    加了他们创始人微信挺久了,也关注shenyu网关一段时间,因为本身在架构组也会接触网关内容

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ug35G2XF-1660442551901)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/26f0c5ab074b4f1e8fdcf92ae81ff5b4~tplv-k3u1fbpfcp-watermark.image?)]

    shenyu网关


    shenyu跟其他网关一样,都是通过责任链的方式,这样可以灵活进行扩展,也能做到每个处理类都难处理到。

    我目前项目也有鉴权功能,也看看别人是怎么实现的

    鉴权sign

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6IwNHmfb-1660442551902)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4a50b101cef748ddade06c4098e7a4a4~tplv-k3u1fbpfcp-watermark.image?)]

    首先肯定是找到对应的模块,shenyu-plugin-sign,SignPlugin 就是网关处理链条中的一环。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kQEM515-1660442551902)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5e9fe576cc434cc49e4cd506d7e43797~tplv-k3u1fbpfcp-watermark.image?)]

    @Bean
    public ShenyuPlugin signPlugin(final SignService signService) {
        return new SignPlugin(signService);
    }
    
    • 1
    • 2
    • 3
    • 4

    就是你在项目里头注入哪个SignService实现类,它会塞到这插件里头来。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWxOTvVb-1660442551903)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/598d4c7758fb4dea9c12ac2a28cb36c2~tplv-k3u1fbpfcp-watermark.image?)]

    它会去判断规则是否存在,什么规则?就是验证签名的时候那些配置,比如说多久超时,哪些url要通过sign验签。

    但是这里也暴露了一个问题,过度依赖配置,如果做到高可用可以做一层backup备份,如果没有配置,或者配置读不到的情况下,读取上次配置的内容。

    DefaultSignService

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gqA9TBI9-1660442551903)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7e505339333b4cefb0324c45eb50c288~tplv-k3u1fbpfcp-watermark.image?)]

    这里有个比较好的东西,就是会将一些内容封装到上下文里头,比如说a节点,处理了一个东西,还要set一个特殊的key到header里面,然后让后面的去拿,这就很不方便了,如果是放在上下文的话,这就统一处理。

    验签逻辑开始,首先是对时间做验证,然后再是算法验。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RgP5OY7-1660442551903)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fc3ce17239424bdc9c722ef9d0325b37~tplv-k3u1fbpfcp-watermark.image?)]

    这里我要直呼一声好家伙,exchange.getRequest().getQueryParams()直接拿到请求的参数,如果你在服务里面实现那得累死你,区分post、get请求,需要特殊处理。

    buildParamsMap(shenyuContext, requestBody)
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PLg9A6Wx-1660442551903)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/db2599de9822405b85560c73fff60a7f~tplv-k3u1fbpfcp-watermark.image?)]

    这个map里头有啥?加了时间戳、url、版本号,请求参数(去除sign)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jAwxBSJ-1660442551903)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/286c6ffe20e84136a1b4c3514537c9eb~tplv-k3u1fbpfcp-watermark.image?)]

    DigestUtils.md5DigestAsHex(sign.getBytes()).toUpperCase()
    
    • 1

    这里是sign签名算法

    总结


    到这里,shenyu的sign插件逻辑就差不多了,直呼好家伙,跟我现在项目里头验签逻辑一毛一样,只是签名算法有所不同。但是这里面还是有些能优化的点,比如说过度依赖shenyu现有的配置内容,需要做到网关点高可用~

    shenyu这里跟其他配置中心也有所不一样,采用map来接收配置内容,我们看nacos、apolla这些框架是刷新到eventment环境变量里头去。

  • 相关阅读:
    WinUI 3 踩坑记:第一个窗口
    MaixII-Dock(v831)学习笔记——UART
    vue自建h5应用,接入企业微信JDK(WECOM-JSSDK),实现跳转添加好友功能
    SpringBoot中有几种定义Bean的方式?
    Unity meta的一些常见属性
    Kerberos认证协议介绍
    挖掘文本的奇妙力量:传统与深度方法探索匹配之道
    java计算机毕业设计ssm+vue杂货网络销售及配送系统
    SSM+优秀宿舍评选系统 毕业设计-附源码221511
    自动化测试如何进行参数化?使用什么工具进行参数化?一文详解parameterized的使用以及如何在自动化中使用。
  • 原文地址:https://blog.csdn.net/weixin_38336658/article/details/126328738