LoopAuth
公布曾经有些时日了,在LoopAuth
1.X 版本中,始终应用 Rbac 的鉴权形式。
LoopAuth
这个我的项目在创立初期,就曾经思考退出 ABAC
的鉴权模式。
9 月份摆烂一个月后,LoopAuth
2.X 版本当初已公布:重构实现,退出 ABAC
鉴权模式,将原有外围模块拆分为 Session
、RBAC
、ABAC
三块。
相干链接
- 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 "检测胜利";}