插件化鉴权
什么是插件化鉴权
插件化鉴权,主要是参考了Higress网关,同时也考虑到,如果鉴权逻辑需要更改,如果需要重启微服务网关集群,那么是个比较消耗成本的事,如果我们采用插件化,那么对于服务器来说,就减少了较多的 “沉默成本”,同时也能保证一些其他不需要鉴权的业务的正常运行(你要说用灰度发布,其实也可以,但是我感觉也比较费力),下面给出目前KaTool-Security的项目架构图
插件生成
具体的代码生成demo,请看gitee代码中的plugin-genrous-demo
public class Main {
public static void main(String[] args) {
ClassUtil classUtil = new ClassUtil();
classUtil.complieClass(
System.getProperty ("user.dir")+"/katool-security-plugin-genrous-demo/src/main/java/cn/katool/security/auth/config",
"AuthLogicPluginDemo"
);
}
}
插件代码
import cn.katool.security.logic.KaSecurityAuthLogic;
import cn.katool.security.logic.KaToolSecurityAuthQueue;
import cn.katool.security.starter.utils.KaSecurityAuthUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Slf4j
@Component
public class AuthConfigPlugin extends KaSecurityAuthUtil<需要鉴权的类型> implements KaSecurityAuthLogic<需要鉴权的类型> {
@Override
public List<String> getUserRoleList() {
KaSecurityUser payLoad = this.getPayLoad();
return Arrays.asList(payLoad.getUserRole());
}
@Override
public List<String> getUserPermissionCodeList() {
return null;
}
// 该方法为鉴权逻辑,如有需要可以自行重写
@Override
public KaSecurityValidMessage doAuth(List<String> anyRoleList, List<String> mustRoleList, List<String> anyPermissionCodeList, List<String> mustPermissionCodeList, KaSecurityAuthCheckMode roleMode, KaSecurityAuthCheckMode permissionMode) {
return KaSecurityAuthLogic.super.doAuth(anyRoleList, mustRoleList, anyPermissionCodeList, mustPermissionCodeList, roleMode, permissionMode);
}
// 该方法为检查登录的逻辑,如有需要可以自行重写
@Override
public KaSecurityValidMessage doCheckLogin(Boolean onlyCheckLogin) {
return KaSecurityAuthLogic.super.doCheckLogin(onlyCheckLogin);
}
// 在1.1.0.RELEASE版本之后,新增逻辑容器概念,建议使用insert方法来进行容器添加,加入的序号为容器序号
@Bean
@Override
public void loadPlugin(){
log.info("AuthConfig init...");
KaToolSecurityAuthQueue.insert(0,this);
}
}
对于doAuth和doCheckLogin这两个方法,我们不做过多解释,这里说一说在1.1.0
之后,接口中新增的方法,loadPlugin
该方法会在插件被动态加载的时候进行调用,类似于最开始写的@Bean来放入KaToolSecurityAuthQueue一样。
但是要注意的是,插件化会覆盖掉原有的执行Bean
插件使用
在 KaTool-Security 的1.1.0版本之后,我们引入了插件化编程,建议您配合配置中心使用
katool:
security:
mode: single
core:
token-header: "Authorization"
plugin:
enable: true # 开启插件化鉴权
class-urls:
- http://xxx/xxx.class # 插件地址
package-name: cn.katool.security.auth.config
tips:但是要注意的是,除了plugin下的属性,其他属性我们目前都没有开启@RefreshScope,也就是说,配置之后不会立即生效,这一点的优化,我们会在后续版本完成。
过几分钟后,就可以看到,鉴权插件的更换。