乐趣区

关于springboot:LoopAuth-2X版本发布这可能是你第一次使用ABAC鉴权

LoopAuth 公布曾经有些时日了,在LoopAuth 1.X 版本中,始终应用 Rbac 的鉴权形式。

LoopAuth 这个我的项目在创立初期,就曾经思考退出 ABAC 的鉴权模式。

9 月份摆烂一个月后,LoopAuth 2.X 版本当初已公布:重构实现,退出 ABAC 鉴权模式,将原有外围模块拆分为 SessionRBACABAC 三块。

相干链接

  • Gitee
  • GitHub
  • 官网文档

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 PermissionInterfaceImpl());

初始化 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 "检测胜利";}
退出移动版