1. Introduction
1.1 Document
Document Website : casbin.org/zh/
Github Website : github.com/casbin/casb…
1.2 Why
使用casbin,在前后端分离中,前端每次只要传一个包含用户的JWT,后端就知道当前访问的API是否有权限。另外,Casbin支持多语言,这样在策略不用改变的情况下,别的语言也可以使用。
Casbin 的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系
1.3 How Work
在 Casbin 中, 访问控制模型被抽象为基于 PERM (Policy, Effect, Request, Matcher) 的一个配置文件
PERM:
- Policy:策略,定义权限的规则, p = {sub, obj, act, eft},策略一般存储到数据库,因为会有很多。
- Effect:影响,它决定我们是否可以放行。
- Request: 访问请求, r = {sub, obj, act}。
- Matcher: 匹配规则,判断 Request 是否满足 Policy。
Request:
一个请求可能长这样: r={sub,obj,act}
- subject:accessed entity访问实体
- object:accessed resource访问的资源;
- action:access method访问方法;
Policy:
策略一般就是這個樣子: p={sub, obj, act} 或 p={sub, obj, act, eft}
- effect:策略结果,一般为空,默认指定allow,还可以定义为deny。
Matcher:
匹配的格式:m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
完整的model.conf
# Request定义
[request_definition]
r = sub, obj, act
# 策略定义
[policy_definition]
p = sub, obj, act
# 角色定义
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
# 匹配器定义
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
policy.csv
p, alice, data1, read
p, bob, data2, write
翻譯過來就是
- alice可以读取data1
- bob可以编写data2
#p是策略,角色,資源,訪問方式
p, member, /helloworld, GET
p, member, /hello, GET
p, member, /world, GET
p, admin, /users, POST
p, admin, /users/:id, DELETE
p, admin, /users/:id, PUT
#g是具體用戶策略,用戶名,用戶角色
g, alice, member
g, alice, admin
g, bob, admin
2. Java Code
2.1 Single Test
<dependency>
<groupId>org.casbin</groupId>
<artifactId>jcasbin</artifactId>
<version>1.2.0</version>
</dependency>
public class HelloController {
public static void main(String[] args) {
String resPath = HelloController.class.getResource("/").getPath();
Enforcer e = new Enforcer(resPath + "model.conf", resPath + "policy.csv");
String sub = "zhangsan";
String obj = "data1";
String act = "read";
if (e.enforce(sub, obj, act) == true) {
System.out.println("通过");
} else {
System.out.println("未通过");
}
}
}
2.2 Springboot Integrator Test
1.Dependency
<dependency>
<groupId>org.casbin</groupId>
<artifactId>casbin-spring-boot-starter</artifactId>
<version> 0.1.2 </version>
</dependency>
2.xxx