LoopAuth 2.X 版本发布——这可能是你第一次使用 ABAC 鉴权

2022-10-18 19:16:52 +08:00
 soberCoding

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

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

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

相关链接

ABAC 初体验

添加依赖

<!-- LoopAuth 的 Springboot 插件 -->
<dependency>
    <groupId>com.sobercoding</groupId>
    <artifactId>LoopAuth-spring-boot-starter</artifactId>
    <version>${version}</version>
</dependency>

实现AbacInterface接口

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;
    }
}

自动注入

@Component
public class AbacInterFaceImpl implements AbacInterface {
    ...
}

手动注入

AbacStrategy.setAbacInterface(new AbacInterFaceImpl());

初始化 ABAC 鉴权规则

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测试一下

    @GetMapping("/test/abac")
    public String abac1(){
        return "检测成功";
    }
318 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/887873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX