Loading... ## 0x00 Intro Casbin是一个权限系统, 它会回答谁(Subject)能对什么(Object)做什么(Action)。 一般而言我们通常在代码中进行权限的控制,而随着系统的越来越庞大,权限控制的代码也会越来越臃肿。Casbin将这种代码控制权限转变成了配置管理权限:通过Model定义,通过Policy实现对用户访问不同的资源进行不同的权限控制,将代码上的权限控制转移到了配置上的权限控制,进而做到简化代码的作用。(从某种意义上来说从代码的复杂变成了配置的复杂Orz) ## 0x01 Demo ``` # RBAC with domains/tenants [request_definition] r = sub, dom, obj, act [policy_definition] p = sub, dom, obj, act [role_definition] g = _, _, _ [policy_effect] e = some(where (p.eft == allow)) [matchers] m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act ``` ## 0x02 [request_definition] ``` [request_definition] r = sub, dom, obj, act r1 = sub, obj, act ``` `request_definition` 定义了你请求验证访问权限时的格式。 对于上述例子,r声明了谁(sub)在哪(dom)的什么(obj)干了什么(act); r1声明了谁(sub)对什么(obj)干了什么(act). ## 0x03 [policy_definition] ``` [policy_definition] p = sub, dom, obj, act p1 = sub, obj, act ``` `policy_definition` 策略定义, 也就是你要将权限以什么格式来存储. 例如: - ``p1, Amy, Profile, read`` - 该行为`p1`的请求,表示Amy可以对Profile进行read操作 - ``p, Amy, class1, grade, write`` - 该行为`p`的请求,表示Amy可以对class1的grade进行write操作 ## 0x04 [role_definition] ``` g = _, _, _ ``` `role_definition` 分组, 也就是定义从属关系,可以将具体角色分类至几个分组中 例如: - class1 = Amy, teacher - class1 = Jack, student - class2 = Bob, teacher - class2 = Salar, student 这四条分表表示: Amy是class1的teacher,Jack是class1的student;Bob是class2的teacher,Salar是class2的student. 其中,`class1`, `class2` 的也叫 `grouping policy`, 可以说是分组策略. ## 0x05 [policy_effect] ``` [policy_effect] e = some(where (p.eft == allow)) ``` 如果判断权限时的结果有`allow`的, 就认为有权限, 否则没有权限. 而是否知道具有权限, 就要看matcher. ## 0x06 [matchers] ``` [matchers] m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act ``` 通过前面几个部分的描述,我们可以非常简单的知道这个模型是如何进行判断的。 上述例子中,``g(r.sub, p.sub, r.dom)`` 实例化了该模型,之后 ``r.dom == p.dom && r.obj == p.obj && r.act == p.act`` 声明了请求的 `{dom, obj, act}` 必须与已经存储的policy相匹配,否则就会`deny`该请求,反之若匹配成功,则返回`allow`. ## 0x07 举个栗子 https://casbin.org/zh-CN/editor 中可以对自己定义的模型进行测试。 ![Casbin Editor](/usr/uploads/2021/06/696112443.png) ### 1. 定义模型 我们首先需要定义一个模型,我们使用默认的`RBAC with domains/tenants`模型,是一种支持域/租户的RBAC的模型. ``` # RBAC with domains/tenants [request_definition] r = sub, dom, obj, act [policy_definition] p = sub, dom, obj, act [role_definition] g = _, _, _ [policy_effect] e = some(where (p.eft == allow)) [matchers] m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act ``` ### 2. 添加Policy 我们定义完了模型,先需要几个Policy,我们以班级期末考试为一个例子 ``` # DATA_STRUCTURE 课程定义 # 教师可以对试题进行读写操作,学生的提交进行读操作,并对其成绩具有读写操作 p, teacher, DATA_STRUCTURE, quiz, write p, teacher, DATA_STRUCTURE, quiz, read p, teacher, DATA_STRUCTURE, submission, read p, teacher, DATA_STRUCTURE, grade, read p, teacher, DATA_STRUCTURE, grade, write # 学生可以对试题进行读操作,学生的提交进行写操作,并对其成绩具有读操作 p, student, DATA_STRUCTURE, quiz, read p, student, DATA_STRUCTURE, submission, write p, teacher, DATA_STRUCTURE, grade, write # 同理,对C_LANGUAGE 课程定义 p, teacher, C_LANGUAGE, quiz, write p, teacher, C_LANGUAGE, quiz, read p, teacher, C_LANGUAGE, submission, read p, teacher, C_LANGUAGE, grade, read p, teacher, C_LANGUAGE, grade, write p, student, C_LANGUAGE, quiz, read p, student, C_LANGUAGE, submission, write p, teacher, C_LANGUAGE, grade, write # 对用户进行分组操作 # Amy是DATA_STRUCTURE的教师,Bob, Cart是学生 g, Amy, teacher, DATA_STRUCTURE g, Bob, student, DATA_STRUCTURE g, Cart, student, DATA_STRUCTURE # 同理,对C_LANGUAGE课程定义, Cart除了是DATA_STRUCTURE的学生,也是C_LANGUAGE的学生 g, Hamilton, teacher, C_LANGUAGE g, Vettle, student, C_LANGUAGE g, Cart, student, C_LANGUAGE ``` ### 3. 提交Request 我们定义完了模型,需要对Model和Policy进行验证。在`Request`区域,每一行代表这一个`Request`请求,`Enforcement Result`的每一行则对应着请求的结果 ``` # Request # Amy作为DATA_STRUCTURE的教师,对以下操作的权限 Amy, DATA_STRUCTURE, quiz, read Amy, DATA_STRUCTURE, quiz, write Amy, DATA_STRUCTURE, submission, read Amy, DATA_STRUCTURE, submission, write Amy, DATA_STRUCTURE, grade, read Amy, DATA_STRUCTURE, grade, write # Bob作为DATA_STRUCTURE的学生,对以下操作的权限 Bob, DATA_STRUCTURE, quiz, read Bob, DATA_STRUCTURE, quiz, write Bob, DATA_STRUCTURE, submission, read Bob, DATA_STRUCTURE, submission, write Bob, DATA_STRUCTURE, grade, read Bob, DATA_STRUCTURE, grade, write # Amy, Bob作为DATA_STRUCTURE的教师和学生,并不能对其他班级的资源进行任何操作 Amy, C_LANGUAGE, quiz, read Amy, C_LANGUAGE, quiz, write Amy, C_LANGUAGE, submission, read Amy, C_LANGUAGE, submission, write Amy, C_LANGUAGE, grade, read Amy, C_LANGUAGE, grade, write # Cart同时作为DATA_STRUCTURE和对C_LANGUAGE的学生,显然能对两个资源同时进行访问 Cart, C_LANGUAGE, quiz, read Cart, C_LANGUAGE, quiz, write Cart, C_LANGUAGE, submission, read Cart, C_LANGUAGE, submission, write Cart, C_LANGUAGE, grade, read Cart, C_LANGUAGE, grade, write ``` ``` # Enforcement Result // ignore // ignore // ignore true true true false true true // ignore // ignore true false false true false false // ignore // ignore false false false false false false // ignore // ignore true false false true false false ``` 最后修改:2020 年 05 月 01 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏