• 认识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相匹配
  • 相关阅读:
    Oracle script to check the database growth
    VUE 项目本地没有问题,部署到服务器上提示错误
    Spring 最常用的几个注解
    Spring @Repository 注解
    VUE 如何将父组件中的数据传递到子组件中
    Spring @Autowired 注解静态变量
    VUE 如何格式化数字
    MySQL原理介绍
    大数据Hadoop之——DorisDB核心概念介绍与简单使用(StarRocks)
    Redis原理介绍
  • 原文地址:https://www.cnblogs.com/Stay-J/p/13375517.html
Copyright © 2020-2023  润新知