V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
soberCoding
V2EX  ›  分享创造

分享一个 JavaWeb 鉴权框架 同时支持 RBAC、ABAC 鉴权方式

  •  1
     
  •   soberCoding · 2022-10-18 19:43:07 +08:00 · 762 次点击
    这是一个创建于 772 天前的主题,其中的信息可能已经有所发展或是发生改变。

    LoopAuth 发布已经有些时日了,在LoopAuth 1.X 版本中,一直使用 Rbac 的鉴权方式。

    LoopAuth 这个项目在创建初期,就已经思考加入ABAC的鉴权模式。

    9 月份摆烂一个月后,LoopAuth 2.X 版本现在已发布: 重构完成,加入ABAC鉴权模式,将原有核心模块拆分为SessionRBACABAC三块。

    相关链接

    ABAC 初体验

    添加依赖

    • ${version}请查看版本历史,请使用最新正式版,且版本与其余拓展最好保持一致
    <!-- LoopAuth 的 Springboot 插件 -->
    <dependency>
        <groupId>com.sobercoding</groupId>
        <artifactId>LoopAuth-spring-boot-starter</artifactId>
        <version>${version}</version>
    </dependency>
    

    实现AbacInterface接口

    • LoopAuthHttpMode 为请求类型的枚举,包括 GET 、PUT 、POST 或 ALL 等等所有常见的请求类型
    public class AbacInterFaceImpl implements AbacInterface {
    
        /**
         *  获取一个或多个路由 /权限代码所属的 规则
         * @param route 路由
         * @param loopAuthHttpMode 请求方式
         * @return 去重后的集合
         */
        @Override
        public Set<Policy> getPolicySet(String route, LoopAuthHttpMode loopAuthHttpMode) {
            // 这里只做演示,自行编写的时候,请根据自己存储 abac 规则的方式查询获取
            Set<Policy> set = new HashSet<>();
            // 根据路由地址及请求方式查询 插入
            if (route.equals("/test/abac") && loopAuthHttpMode.equals(LoopAuthHttpMode.GET)){
                set.add(new Policy()
                        // 规则名称
                        .setName("test")
                        // 规则中的属性名称 及 属性值 用于后续进行 规则匹配校验
                        .setProperty("loginId", "2")
                );
            }
            return set;
        }
    }
    

    自动注入

    • AbacInterface的实现类上加上@Component注解即可
    @Component
    public class AbacInterFaceImpl implements AbacInterface {
        ...
    }
    

    手动注入

    • 保证项目启动时执行下面语句即可
    AbacStrategy.setAbacInterface(new AbacInterFaceImpl());
    

    初始化 ABAC 鉴权规则

    • 需要保证项目启动时 执行以下代码
    • 以下代码以匹配loginId为例
    • 请根据自己需求更改
    AbacStrategy.abacPoAndSuMap = new AbacPolicyFunBuilder()
            // 自定义登录 id 校验的鉴权规则
            .setPolicyFun("loginId",
                    // 创建规则校验及获取当前值的方式
                    new AbacPoAndSu()
                            // 创建校验方式  value 为当前值即 setSupplierMap 提供的值
                            // rule 为规则的值即 Policy setProperty 的值
                            .setMaFunction((value, rule) -> {
                                // 当前用户 id 需要与规则匹配才可访问  否则 抛出异常
                                if (!value.equals(rule)){
                                    throw new LoopAuthPermissionException(LoopAuthExceptionEnum.NO_PERMISSION);
                                }
                            })
                            // 获得 value 方式
                            .setSupplierMap(() -> "2")
            ).build();
    
    
    

    注入拦截器

    @Component
    public class LoopAuthMvcConfigure implements WebMvcConfigurer {
        /**
         * 注册 LoopAuth 的拦截器,打开注解式鉴权功能
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // abac 拦截器
            registry.addInterceptor(new InterceptorBuilder().Abac().builder()).addPathPatterns("/**");
        }
    }
    

    创建Controller测试一下

    • 可以更改setSupplierMap()中的返回值、或请求类型理解
        @GetMapping("/test/abac")
        public String abac1(){
            return "检测成功";
        }
    
    soberCoding
        1
    soberCoding  
    OP
       2022-10-18 19:43:40 +08:00
    有任何问题可留言
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1101 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:40 · PVG 06:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.