• Casbin 使用记录


    Casbin 是什么?

    官方解释:Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型

    Casbin只负责访问控制。身份认证 authentication(即验证用户的用户名、密码),需要其他专门的身份认证组件负责。例如(jwt-go)

    两个核心概念:

    访问控制模型model和策略policy。

    工作原理:

    Casbin把  访问控制模型  被抽象为基于 

    PERM元模型 (Policy, Effect, Request, Matchers) [策略,效果,请求,匹配器]

    PERM(Policy, Effect, Request, Matchers)模型很简单, 但是反映了权限的本质 – 访问控制

    • Policy: 定义权限的规则
    • Effect: 定义组合了多个 Policy 之后的结果, allow/deny
    • Request: 访问请求, 也就是谁想操作什么
    • Matcher: 判断 Request 是否满足 Policy

    匹配来源:定义的 request 和 存储的 police 比对判断。

    所有 model file 中主要就是定义 PERM 4 个部分。

    的一个文件( model.conf , 这个文件一般是固定的)。 因此,切换或升级项目的授权机制与修改配置一样简单。 您可以通过组合可用的模型来定制您自己的访问控制模型(ACL, RBAC,  ABAC)。 例如,您可以在一个model中获得RBAC角色和ABAC属性,并共享一组policy规则。

    Casbin中最基本、最简单的model是ACL。ACL中的model CONF为:

    # Request definition
    [request_definition] 自定义请求的格式
    r = sub, obj, act
    
    # Policy definition
    [policy_definition] 策略定义
    p = sub, obj, act
    
    # Policy effect
    [policy_effect] 
    e = some(where (p.eft == allow))
    
    # Matchers
    [matchers]
    m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
    

      g, g2, g3 表示不同的 RBAC 体系, _, _ 表示用户和角色 _, _, _ 表示用户, 角色, 域(也就是租户)

    ACL model的示例policy如下:

    p, alice, data1, read
    p, bob, data2, write
    

      

    Model 语法:

    • Model CONF 至少应包含四个部分: [request_definition], [policy_definition], [policy_effect], [matchers]

    • 如果 model 使用 RBAC, 还需要添加[role_definition]部分

    policy 不同,model 只能加载,不能保存。 因为我们认为 model 不是动态组件,不应该在运行时进行修改,所以我们没有实现一个 API 来将 model 保存到存储中.

    policy file

    定义具体的策略, 权限的检查就是基于定义的 model file 和 policy file 来完成的.

    相对于 model file 定义规则, policy file 中定义的就是具体的内容.

    如何使用?

    创建一个Casbin决策器需要有一个模型文件和策略文件为参数:

    import "github.com/casbin/casbin"
    
    e := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
    

      

    在访问发生之前, 在代码中添加强制挂钩:(这一步就是校验访问控制权,然后根据返回值做对象的分之操作)

    sub := "alice" // the user that wants to access a resource.
    obj := "data1" // the resource that is going to be accessed.
    act := "read" // the operation that the user performs on the resource.
    
    if e.Enforce(sub, obj, act) == true {
        // permit alice to read data1
    } else {
        // deny the request, show an error
    }
    

      

     casbin 存储到数据库的记录是策略, 访问控制模型当系统确定户基本很少改动。可以存储到项目配置文件(本地)

     casbin 存储RBAC方案中用户和角色之间的映射关系。(而这个关系是基于 midel 访问控制模型)

    权限管理系统最好全局依赖 一个Casbin 决策器(这个决策器 依赖 模型文件和策略文件为参数)

    在访问发生之前,在代码中加入强制钩子,控制。

    这个请求格式是可以自定义的, 默认为默认的请求格式为 { subject, object , action }

    sub := "alice" // the user that wants to access a resource.
    obj := "data1" // the resource that is going to be accessed.
    act := "read" // the operation that the user performs on the resource.
    
    if e.Enforce(sub, obj, act) == true {
        // permit alice to read data1
    } else {
        // deny the request, show an error
    }
    

      

    Casbin 模型可以是多个组合。也可以共享同一组policy规则。

    数据库里存储的 策略 第一个字段代表的是在 model 里定义的模型类型。

    p, alice, data1, read  其中的 p 是在 model.conf 文件中定义好的。

    多租户示例

    定义 model file

    [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
    

      

    Cabin 没有验证用户是否是有效的用户,或者角色是一个有效的角色。 这应该通过认证来解决。

    参考资料:https://www.cnblogs.com/xiaohunshi/p/10372881.html

         https://www.cnblogs.com/wang_yb/archive/2018/11/20/9987397.html

  • 相关阅读:
    Web Site Administration Tool 文章收集
    Sql中补零方法及其它
    PowerDesigner 教程
    什么是Zend
    什么是CMS系统?
    谈谈今天遇到的编译工具查错的问题
    Lec4快速排序
    堆排序 zz
    强大的Python
    Lec6待学习的堆排序
  • 原文地址:https://www.cnblogs.com/winyh/p/11367927.html
Copyright © 2020-2023  润新知