这个框架是个人研发的一款鉴权框架,在这里,我们不从鉴权维度上面进行讨论,而是从系统设计方面展开。
写这篇文章,一是为了总结,二是为了提升开源活跃度。
项目介绍
框架最开始的目的,是为了解决微服务下的鉴权问题,提供一套可行的微服务鉴权治理方案以及降级处理策略。
感兴趣的同学可以去官网看一下,顺便给洒家一个start也行,hhh:http://security.katool.cn/
前置知识
Spring(IOC和AOP必须掌握)、SpringBoot(对于注解要熟悉)、微服务分布式应用开发基础
Redis
MySQL/MyBatis/MyBatisPlus
Dubbo
Nacos
设计模式:单例 工厂 建造者 模板方法 状态 修饰器
鉴权流程图
添加描述
项目模块
└─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
├─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:
复制
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]
如果有其他问题,欢迎在群内或者评论区发表,解决后会将典型问题放置于正文