作者以及各位大佬们好,有关于我么系统的权限问题想请教一下各位:
一、关于系统本身的鉴权的理解
拜读了作者大大的源码以后发现,我们实现PreAuth注解,然后通过AOP的方式对进入各个微服务的请求进行权限控制,只要我们引入blade-core-secure包即可,在blade-core-secure会通过SPL表达式进行SQL查询(或者读取Redis缓存)
二、关于鉴权产生的疑问
默认我们配置了Spring.DataSource是我们的Bladex库,所以引入了上述secure包以后,我们集成进来,访问的也是我们的Bladex的数据库,但是如果我们配置了Spring.DataSource为我们自身的业务数据库,再去引入secure包的话,jdbctemplate是不是就会使用我们业务数据库的连接配置呢。
二、个人思考解决方式
1. 通过多数据源的方式: 在每个需要连接业务数据库的服务模块,我们配置多数据源,默认数据源选择Bladex数据库,然后配置一个业务数据库的数据源,在Service的方法实现类上,加上@DS的注解选择业务数据库
2. 通过Fegin访问方式: 在原有的blade-system里面已经提供了ApiScopeClient的访问,我们抽离处一个包,做AOP拦截时候访问ApiScopeClient来做鉴权
3. 底层改了secure模块,然后去指定template模板加载
二、你期待的结果是什么?实际看到的又是什么?
如果我的疑问不存在,那么麻烦作者大大告诉下,如果我得疑问确实存在,想请各位大佬们帮忙指导一下该用怎么样的方式解决这个问题比较好呢?
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
商业版本 Bladex , 2.4.0版本, Windows系统
目前确实是绑定Bladex数据库。如果是微服务,每个服务一个数据库的模式下。确实无法通过@PreAuth在缓存为空的情况下,查询数据库角色权限再放入缓存。
1、可以基于Bean模式进行非jdbcTemplate进行绑定。然后自定义实现Bean
2、缓存为空,远程Feign调用
3、完全无状态。不通过缓存,不通过远程调用,把角色别名,权限编号放入jwt字段中。目前只是把角色别名放入jwt。从工具类中自定义接口权限判断。
个人喜欢完全无状态,但弊端就是jwt无法实时废弃、更新。
在BladeX推荐第二种feign的方式,apiScopeClient写一个对应的client重写IPermissionHandler,然后其他的模块引入,这样就可以都从sys服务获取数据而不受制于多数据源的问题了。因为PreAuth底层获取的IPermissionHandler会从feignclient走而不是默认的底层jdbcTempate了
而这个已经实现了,只需要引入对应依赖就行
当然最简单的方案还是做完全的无状态
具体加载替换逻辑
==============
补充回答
关于你下面提到的feign内耗问题,这个完全不用担心,因为只有在没有缓存的时候,第一次调用才会使用feign,等成功返回后就会把数据存入redis,下次再请求,就直接从redis缓存取了,不会再调用feign。
扫一扫访问 Blade技术社区 移动端