基于 JCasbin 的属性访问控制(ABAC)演示项目,实现业务逻辑与权限逻辑的完全解耦。
cd springboot-permission
mvn spring-boot:run打开浏览器访问:http://localhost:8080
- ABAC 权限模型:基于用户和资源属性的动态授权
- AOP 切面拦截:通过
@CheckPermission注解实现无侵入式权限控制 - 策略动态配置:支持运行时添加/删除策略规则
- 前后端分离:HTML + Tailwind CSS + Axios
| 规则 | 主体条件 | 资源条件 | 操作 |
|---|---|---|---|
| 同部门可编辑 | r.sub.dept == r.obj.dept && r.sub.id == r.obj.ownerId |
true |
edit |
| 同部门可读 | r.sub.dept == r.obj.dept |
true |
read |
| 所有者可删除 | r.sub.id == r.obj.ownerId |
true |
delete |
| 公开文档可读 | true |
r.obj.type == "public" |
read |
- 张三(研发部)只能编辑研发部的文档
- 李四(销售部)无法访问研发部文档
- 文档创建者可以删除自己的文档
- 其他用户无法删除
- 所有用户都可以阅读
type=public的文档
- 后端:Spring Boot 3.2.0 + JCasbin 1.55.0
- 前端:HTML + Tailwind CSS + Axios
- 权限引擎:JCasbin(支持 RBAC/ABAC/RBAC with domains)
@CheckPermission(action = "edit")
@PutMapping("/{id}")
public Result<Document> update(@PathVariable String id, @RequestBody Document doc) {
return Result.success(documentService.update(doc));
}模型文件(model.conf):
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub_rule, obj_rule, act
[matchers]
m = eval(p.sub_rule) && eval(p.obj_rule) && r.act == p.act
策略文件(policy.csv):
p, r.sub.dept == r.obj.dept, r.sub.id == r.obj.ownerId, edit
p, r.sub.dept == r.obj.dept, true, read