【JAVA】Casbin的入門使用

89 阅读2分钟

1. Introduction

1.1 Document

Document Website : casbin.org/zh/

Github Website : github.com/casbin/casb…

图片.png

图片.png

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("未通过");
        }
    }
}

图片.png

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

3.x

图片.png