LoopAuth
发布已经有些时日了,在LoopAuth
1.X 版本中,一直使用 Rbac 的鉴权方式。
LoopAuth
这个项目在创建初期,就已经思考加入ABAC
的鉴权模式。
9 月份摆烂一个月后,LoopAuth
2.X 版本现在已发布: 重构完成,加入ABAC
鉴权模式,将原有核心模块拆分为Session
、RBAC
、ABAC
三块。
${version}
请查看版本历史,请使用最新正式版,且版本与其余拓展最好保持一致<!-- 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;
}
}
AbacInterface
的实现类上加上@Component
注解即可@Component
public class AbacInterFaceImpl implements AbacInterface {
...
}
AbacStrategy.setAbacInterface(new AbacInterFaceImpl());
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 "检测成功";
}