KaTool-Security
Home
GetStart
  • AuthCenter
  • 适配SpringCloudGateWay
  • 适配Zuul
  • 网关中间件更换适配方案
  • 插件化鉴权
  • 注解文档
  • Restful响应文档
  • 内部方法文档
  • Auth中心RPC调用接口文档
  • 1.1.0.RELEASE之前
  • 1.1.0.RELEASE新概念
  • 参与贡献
  • 未来规划
  • KaTool
  • KaToolTest
  • 在github上修改本页面
  • Karos'Blog
Home
GetStart
  • AuthCenter
  • 适配SpringCloudGateWay
  • 适配Zuul
  • 网关中间件更换适配方案
  • 插件化鉴权
  • 注解文档
  • Restful响应文档
  • 内部方法文档
  • Auth中心RPC调用接口文档
  • 1.1.0.RELEASE之前
  • 1.1.0.RELEASE新概念
  • 参与贡献
  • 未来规划
  • KaTool
  • KaToolTest
  • 在github上修改本页面
  • Karos'Blog
  • 插件化鉴权

插件化鉴权

什么是插件化鉴权

插件化鉴权,主要是参考了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,也就是说,配置之后不会立即生效,这一点的优化,我们会在后续版本完成。

过几分钟后,就可以看到,鉴权插件的更换。

执行结果

image-20240617202242187