gateway白名单存储nacos,改成存储数据库
前言
很久没写博客了,csdn都开始ai润色了,之前都是看相应框架的源码看了个遍,感觉底层原理都差不多,这阵子着手改造了下gateway中的白名单,之前白名单存储到nacos,要改成存到数据库。里面涉及到浅浅的源码原理,由于之前看过Spring源码,整个流程几分钟就debug完了,体会到了看源码的好处了,也就是后置处理器的选择上。也记录一下。
需求
公司的nacos部署在公网,被恶意攻击了,白名单配置信息放到nacos上不安全,所以要改造一下gateway
改造原理
项目基于sa-token进行认证,找到nacos上的白名单key:security.ignore.whites 去代码上全局搜一下,很容易找到gateway中的认证核心逻辑代码位置,定位到在SaReactorFilter里面会对path进行认证,改成读取db缓存中的白名单即可,由于项目中RedisTemplate的key序列化器没用字符串序列化器,我这临时替换还原了一下。
难点
项目中用到了:数据库sql自动升级任务。是基于@PostConstruct实现的,且没有指定bean order顺序。不好改别人的代码,指定order顺序顺序执行bean方法的方案pass
我这边的sql脚本在项目启动的时候会被自动创建
表创建好了,db数据也有了,项目启动的时候还要干一件事,就是把db中的数据丢到缓存里面,这里涉及到一个bean的加载顺序。加载db的数据到缓存,要在sql升级任务后执行
开始debug源码
之前看过@PostConstruct的执行时间,但是有点忘记了,直接在@PostConstruct方法里面打个断点,看一下执行的栈帧
定位到是在applyBeanPostProcessorsBeforeInitialization这个前置处理器处理的@PostConstruct,然后发现还有个applyBeanPostProcessorsAfterInitialization在@PostConstruct后执行
发现直接用的顶层后置处理器BeanPostProcessor
当时有点纠结要用哪个后置处理器,去实现这个需求,对照名字看了一圈没找到合适的
最后基于最原始的BeanPostProcessor实现一下就好了