前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >KaTool-Security微服务鉴权框架源码浅析

KaTool-Security微服务鉴权框架源码浅析

原创
作者头像
Karos
修改2024-05-24 13:55:55
640
修改2024-05-24 13:55:55
举报
文章被收录于专栏:MyBlog-KarosMyBlog-Karos

这个框架是个人研发的一款鉴权框架,在这里,我们不从鉴权维度上面进行讨论,而是从系统设计方面展开。

写这篇文章,一是为了总结,二是为了提升开源活跃度。

项目介绍

框架最开始的目的,是为了解决微服务下的鉴权问题,提供一套可行的微服务鉴权治理方案以及降级处理策略。

感兴趣的同学可以去官网看一下,顺便给洒家一个start也行,hhh:http://security.katool.cn/

前置知识

  • Spring(IOC和AOP必须掌握)、SpringBoot(对于注解要熟悉)、微服务分布式应用开发基础
  • Redis
  • MySQL/MyBatis/MyBatisPlus
  • Dubbo
  • Nacos
  • 设计模式:单例 工厂 建造者 模板方法 状态 修饰器

鉴权流程图

项目模块

代码语言:javascript
复制
└─katool-security-starter-parent
   └─katool-security-auth                                                # 微服务鉴权中心服务
   │  └─src/main/java
   │          └─cn.katool.security
   │                      └─auth
   │                          ├─aop                                # 日志记录切面
   │                          ├─controller                # 鉴权服务控制器
   │                          ├─exception                # 异常处理
   │                          ├─job                                # 定时任务 - 每10分钟自动关闭所有接口鉴权
   │                          ├─mapper                        # MyBatisPlus-Mapper层
   │                          ├─model                        # Auth实体类、KaSecurityUser实体类
   │                          ├─service                        # AuthController对应的service层,以及KaSecurityUser
   │                          └─utils                        # 用到的一些工具类
   ├─katool-security-core
   │  └─src/main/java
   │         └─cn.katool.security
   │                     └─common
   │                         ├─annotation                # 鉴权注解(@AuthCheck)
   │                         ├─constant                # 常量
   │                         ├─logic                        # 微服务鉴权处理逻辑层
   │                         ├─model
   │                         │  ├─dto/auth
   │                         │  ├─entity
   │                         │  └─vo
   │                         └─utils                        # JSON转换工具
   ├─katool-security-gateway-starter-parent        # 微服务 - 网关层面鉴权starter父模块
   │  ├─katool-security-gateway-core                # 统一接口(用于获取Token,但是Request由于不同框架实现不同,各自自行实现Request上下文获取)
   │  │  └─src/main/java
   │  │              └─cn.katool.security.gateway
   │  │                              └─service
   │  ├─katool-security-gateway-spring-cloud-gateway-starter                # Spring Cloud GateWay Starter
   │  │  └─src/main/java
   │  │           └─cn.katool.security.starter
   │  │                           ├─gateway
   │  │                           └─utils
   │  └─katool-security-gateway-zuul-starter                                                # Zuul Stater
   ├─katool-security-interceptor
   │  └─src/main/java
   │              └─cn.katool.security
   │                          └─interceptor        # AOP鉴权拦截切面逻辑
   ├─katool-security-interface
   │  └─src/main/java
   │              └─cn.katool.security
   │                          └─service                # Dubbo 远程调用接口
   └─katool-security-spring-boot-starter                # 单体项目引入的Starter
       └─src/main/java
                   └─cn.katool.security
                               └─starter

项目架构图

部分代码导读

后端

基础鉴权业务流

对于使用方法可以看看官网,当你看到这里,默认你已经熟练使用。

这里的@AuthControllerCheck注解用于表示整个类下的接口都要鉴权,onlyCheckLogin表示只需要判断是否登录,excludeMethods里面放入需要排除的接口方法名和参数名(这里使用有点麻烦,在未来可以考虑改为使用注解@ExcludeCheck来进行排除)

对于注解,我们采用aop的方式进行处理,并且会判断当前开启的模式是单体还是微服务,如果是单体模式直接走鉴权,微服务的话会判断该请求是否经过了网关染色来判断是否需要鉴权。

对于鉴权的方法判断,这里的KaSecurityAuthLogic是交与开发者自行实现,并且要求放入KaToolSecurityAuthQueue,该队列是对LinkedBlockingQueue的封装,可能有不同的鉴权逻辑,我们通过队列来进行遍历鉴权(这一块是对不同逻辑进行统一鉴权,开发者可以通过控制Bean加载顺序来改变鉴权的顺序,但是未来考虑到也有可能有不同接口拥有不同的鉴权逻辑的场景,这一块未来有时间可以开发)

对于validFilter,这一块,先判断是否登录

这里可能对返回success有点疑问。

succes表示的是流程状态,如果是成功,那么往下面走流程,否则的话就会产生熔断。

如果没有登录,那么就直接熔断,可能这里有一点绕,但是需要开发者理解一下。

除了success和onlyLogin,那么其他类型都会返回到上游进行判断

说到这里,来看看状态码

如果说,你认为还有其他状态码需要加入,也可以跟入,当然开发者也可以基于这个类来自定义返回状态。

以上是主要的鉴权逻辑,接下来是对于微服务治理方案的解决。

微服务治理

如此,其他的地方差不多

剩下来就是网关白名单同步

在上述代码中,可以看到authService.saveOrUpdate(one);方法,这是一个Dubbo远程调用。

该代码在Auth服务中,同时默认情况下每过10分钟进行路由刷新,这一块后续可以改为通过配置设置

这里后续可以考虑采用parallelStream()异步流来进行处理,或者采用Lists.partition()来简化代码。

对于不同网关,白名单也是通过定时任务来控制

白名单同步

部分代码可能在早期的时候写的可能稍微复杂,后续可以逐步优化,比如加入异步流的使用等等,qwq

前端

https://gitee.com/karosown/KaTool-Security-Auth-Center

代码语言:javascript
复制
├─public
└─src
    ├─assets
    ├─components
    │  ├─error
    │  ├─roleComponents
    │  └─userComponents
    ├─core
    │  ├─config
    │  ├─request
    │  │  ├─api
    │  │  └─model
    │  │      ├─common
    │  │      └─user
    │  └─utils
    ├─router
    ├─store
    │  └─modules
    └─view
        ├─auth-admin                        # 路由权限管理
        ├─dataPage                          # 首页
        ├─log                              # 日志服务
        ├─manngger-main                     # 站点共用内容、配置管理  
        ├─role-admin                        # 角色管理
        ├─token-admin                       #  Token管理
        └─user-admin

未来发展

  • *目前鉴权层面,主要是通过对role进行判断,但是很多时候也需要对资源进行鉴权,维度应该下钻
  • *对于Auth中台后续可以考虑通过配置类单独移植到各个服务中
  • 目前对于鉴权的处理逻辑是让用户实现代码后进行鉴权,但是如果鉴权逻辑需要修改,那么对于单体服务来说肯定是没多大问题,但如果在微服务情况下,网关灰度发布,可能会导致部分业务不可用,同时如果配置不好可能导致鉴权逻辑多网关鉴权逻辑不一致的问题。

    (后续考虑采用插件的模式进行鉴权组装,但由于网关可能是集群,所以若用后台代码导入动态编译类加载会很麻烦,具体解决方案可参考配置中心+class文件加载,具体的class文件可以JavaComplier来进行编译(因为会用到一些公有类,或者让开发者自行编译后,以链接的形式放入config中,我们再从config读取链接进行类加载,具体的参考了Higress网关对于鉴权插件的Docker处理方式 https://higress.cn/zh-cn/blog/nacos)

  • 支持接口统计BI分析,以及前端starter制作
  • 对于各种注册中心、配置中心适配

开发上的问题

由于maven镜像同步不及时,可能会导致部分包依赖问题

可将下面的包放入本地仓库中 cn.katool包下

暂时无法在飞书文档外展示此内容

对于katool工具包,提供了redis多级缓存策略,具体的使用可以看看

https://katool.cn/

Maven install

因为要starter上传maven中央仓库,所以需要配置签名,如果电脑上面没有签名 或者 电脑上签名过期 的话,那么sign就会失效

本地解决问题方法如下,注释掉所有starter中的该plugin:

代码语言:javascript
复制
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-gpg-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
    </executions>
</plugin>

install顺序

  • katool-security-starter-parent 提示无法在maven仓库找到这是肯定的,因为parent我没有上传中央仓库。

[INFO] katool-security-starter-parent ..................... SUCCESS [ 0.383 s]

[INFO] katool-security-core ............................... SUCCESS [ 1.591 s]

[INFO] katool-security-interface .......................... SUCCESS [ 0.159 s]

[INFO] katool-security-interceptor ........................ SUCCESS [ 0.158 s]

[INFO] katool-security-task ............................... SUCCESS [ 0.108 s]

[INFO] katool-security-spring-boot-starter ................ SUCCESS [ 2.348 s]

[INFO] katool-security-auth ............................... SUCCESS [ 8.752 s]

[INFO] katool-security-gateway-starter-parent ............. SUCCESS [ 0.007 s]

[INFO] katool-security-gateway-core ....................... SUCCESS [ 0.094 s]

[INFO] katool-security-gateway-spring-cloud-gateway-starter SUCCESS [ 1.644 s]

[INFO] katool-security-gateway-zuul-starter ............... SUCCESS [ 1.735 s]

如果有其他问题,欢迎在群内或者评论区发表,解决后会将典型问题放置于正文

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目介绍
    • 前置知识
      • 鉴权流程图
        • 项目模块
        • 项目架构图
        • 部分代码导读
          • 后端
            • 基础鉴权业务流
            • 微服务治理
            • 白名单同步
          • 前端
          • 未来发展
          • 开发上的问题
            • Maven install
            相关产品与服务
            微服务引擎 TSE
            微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档