认识casbin

学习笔记:

概念:

casbin是一个什么东西?

  • Casbin是一个权限控制系统,可以支持多种(ACL, RBAC, ABAC等)权限类型

我们最终需要实现的效果:

  • 可以控制一人/角色(sub)能否对某个资源(obj)进行某种操作(act)

配置文件

配置文件一共有两个:model.file 和 policy.file ,一个是访问控制模型,一个是权限注册表。

  1. model.conf

    # 定义了请求格式
    [request_definition]
    r = sub, obj, act
    
    [policy_definition]
    p = sub, obj, act
    
    # 此处设置为 RBAC 类型 “用户” , “角色”, 主要在matchers中使用 是用于 用户角色分配或者是 资源的继承
    [role_definition]
    g = _, _
    
    # Policy effect 定义了什么情况下这个请求是被允许的
    [policy_effect]
    e = some(where (p.eft == allow))
    
    # Matchers //定义了如何将请求和权限相匹配
    [matchers]
    m = (g(r.sub, p.sub) || p.sub == "*") && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")
    

    Casbin使用PERM来描述一种模型(Policy、Effect、Request、Matcher),其中:

    • sub:Subject——表示Request中的accessing entity,即 “是谁” 发起的请求
    • obj :Object——表示Request中的accessed resource,即被请求访问 “目标资源”
    • act :Action——表示Request中的access method, 即请求要对资源 “做什么”
  2. policy.file

    p, anonymous, /, GET
    p, admin, /*, *
    p, anonymous, /admin*, GET
    p, anonymous, /admin*, POST
    

    第一行定义了一个权限:anonymous(用户 || 组 || 角色) 对/ 拥有 get 行为

工作原理

enforcer = casbin.Enforcer("casbin_middleware/authz_model.conf", "casbin_middleware/authz_policy.csv")
enforcer.enforcer(sub, obj, act)

举个栗子:比如说 anonymous 想要 GET 请求 / 路径

  1. 由于在model.file 中我们定义了传入参数的格式:应该传入的就是 ("anonymous", "/admin", "GET") 分别对应了 r.sub, r.obj, r.act
  2. 在 policy.file 中我们也定义了 policy 的格式,所以当我们从 policy file 中读取一行数据的时候,分别就对应了 p.sub, p.obj, p.act
  3. 最后根据 matcher所定义的规则,将请求和权限进行匹配,若是某个规则匹配了 那么p.eft = allow
    • r.sub == p.sub 满足条件的有三条权限(1, 3, 4 )
    • r.obj == p.obj 剩下的三条权限中满足条件的有两条(3, 4)
    • r.act == p.act 剩下的两条权限中满足条件的有一条(4)

复杂一些

例1. 用户alice和bob同属于一个名为admin的角色(分组),而admin角色可以对 “/v1”路径下的所有资源进行任何操作!

model.file

[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) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")

policy file:

p, admin, /v1/*, *

g, alice, admin
g, bob, admin

加一个超级管理员?

[matchers]
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")|| r.sub == "root"

扩展补充

在[role_definition]中,g有两种不同的写法:
g = _, _ 表示用户,角色
g2 = _, _, _ 表示用户,角色,域

Matcher中的函数

matcher内置了若干个函数来支持开发者更好的定制自己的模型,甚至可以使用我们自定义的函数。当前支持的函数如下:
函数 释义

  1. keyMatch(arg1, arg2) ,arg1为URL,如 /v1/admin/file,arg2为URL 或 模板,如:/v1/admin/,返回 arg1 是否与 arg2 相匹配
  2. keyMatch2(arg1, arg2) ,arg1为URL,如 /v1/admin/file2,arg2为URL或模板,如:/v1/admin/:file,返回 arg1 是否与 arg2 相匹配
  3. regexMatch(arg1, arg2), arg1为任意字符串,arg2为正则表达式,返回arg1是否与arg2相匹配
  4. ipMatch(arg1, arg2) ,arg1为IP地址 如 192.168.12.42,arg2为iP地址或CIDR如 192.168.12. 0/24,返回arg1是否与arg2相匹配
posted @ 2020-07-25 09:00  沈俊杰  阅读(1248)  评论(0编辑  收藏  举报