概念:

Casbin是什么?

  • Casbin是一个访问控制框架,可以支持多种访问控制模型(如ACL、RBAC、ABAC等)

目的:

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

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

配置文件:

配置文件有两个:model file和policy file,分别用是访问控制模型文件和权限注册表

  • 在model file中,我们可以修改和定制想要使用的模型,如ACL、RBAC或者是自己组合出一个更适合项目的模型
  • 在policy file中,存放着被注册的权限,用于表示某人/角色对某资源有某种行为的权限

1. model file:

    # 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

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, bob, data2, write
p, alice, data1, read
p, alice, data1, write
p, alice, data2, read

第一行定义了一个权限,表明一个叫Alice的用户/组可以对data1这个资源进行read操作

工作原理:

例如:用户Alice想要read一下data1

  1. 由于在model file中我们定义了请求的格式,所以我们这次的请求应该写为 alice,data1,read,分别对应了 r.sub、r.obj、 r.act

  2. 在model file中我们也定义了policy的格式,所以当我们从policy file中读取出一行权限时,分别对应着p.sub、p.obj、p.act

  3. 根据matcher所定义的规则,将请求与权限进行匹配,若某policy匹配成功,则p.eft = allow

    r.sub == p.sub 满足条件的有三条权限(2、3、4 )

    r.obj == p.obj 剩下的三条权限中满足条件的有两条(2,3)

    r.act == p.act 剩下的两条权限中满足条件的有一条(2)

  4. 根据policy_effect定义的规则返回最终结果,此处定义的规则为:任意一条policy匹配成功,则返回allow

最后,Alice如愿read到了data1

何不复杂点?

例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

例2:

加一个超级管理员?

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

扩展补充

  1. 在[role_definition]中,g有两种不同的写法:

    g = _, _ 表示用户,角色

    g2 = _, _, _ 表示用户,角色,域
  2. Model的三种加载方式
  • 从文件中加载:

e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

  • 从代码中加载:

     // Initialize the model from Go code.
    m := casbin.NewModel()
    m.AddDef("r", "r", "sub, obj, act")
    m.AddDef("p", "p", "sub, obj, act")
    m.AddDef("g", "g", "_, _")
    m.AddDef("e", "e", "some(where (p.eft == allow))")
    m.AddDef("m", "m", "g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act") // Load the policy rules from the .CSV file adapter.
    // 使用自己的 adapter 替换。
    a := persist.NewFileAdapter("examples/rbac_policy.csv") // 创建一个 enforcer。
    e := casbin.NewEnforcer(m, a)

从字符串中加载

// Initialize the model from a string.
text :=
`
[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
`
m := NewModel(text) // Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid files.
a := persist.NewFileAdapter("examples/rbac_policy.csv") // Create the enforcer.
e := casbin.NewEnforcer(m, a)
  1. Matcher中的函数

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

    函数 释义

  2. keyMatch(arg1, arg2) arg1为URL,如 /v1/admin/filerag2为URL或 模板,如:/v1/admin/返回arg1是否与arg2相匹配

  3. keyMatch2(arg1, arg2) arg1为URL,如 /v1/admin/file2rag2为URL或 : 模板,如:/v1/admin/:file返回arg1是否与arg2相匹配

  4. regexMatch(arg1, arg2) arg1为任意字符串,arg2为正则表达式返回arg1是否与arg2相匹配

  5. ipMatch(arg1, arg2) arg1为IP地址 如 192.168.12.42arg2为iP地址或CIDR,如 192.168.12. 0/24返回arg1是否与arg2相匹配

添加自定义函数见 自定义函数

  1. Casbin API (带注释)

    https://blog.csdn.net/lk2684753/article/details/99680892

  2. 权限系统设计模型分析

    见文档【权限系统设计模型分析】

    更多信息

    Casbin使用PERM的方式来描述模型,这使得我们可以灵活的自定义出更加适合自己项目的访问控制模型。

    在[matchers]中,Casbin还提供了一些函数以方便匹配(如例1中使用的keyMatch(arg1, arg2))

官方文档:https://casbin.org/docs/zh-CN/overview

在线编辑:https://casbin.org/en/editor

如何理解Casbin的权限控制的更多相关文章

  1. C++成员权限控制(总结)

    1) 前言 在我学习C++的过程中,类中成员的权限控制一直是比较头疼的一个点,一会public,一会又private,还有protected,再加点继承,而且又有公有继承.私有继承,保护继承,所以感觉 ...

  2. SNF快速开发平台2019-角色、权限、账户的概念理解-非常全的理论讲解权限控制

    组织模型   资源模型  操作模型 谁能够执行哪些操作    执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源 ...

  3. 使用 Casbin 作为 ThinkPHP 的权限控制中间件

    PHP-Casbin 是一个强大的.高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理. Think-Casbin 是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发 ...

  4. 权限控制和OAuth

    目录 1 权限控制是什么 1.1 ACL 1.2 RBAC 1.2.1 名词术语 1.2.2 RBAC定义 1.2.3 RBAC分类 1.2.3.1 RBAC0 1.2.3.2 RBAC1 1.2.3 ...

  5. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

  6. ASP.NET MVC实现权限控制

    这篇分享一下 ASP.NET MVC权限控制.也就是说某一用户登录之后,某一个用户是否有权限访问Controller,Action(操作),视图等 想实现这些功能,需要在数据库创建好几个表:[User ...

  7. 浅谈Yii-admin的权限控制

    说到CMS,最需要有的东西就是权限控制,特别是一些复杂的场景,多用户,多角色,多部门,子父级查看等等.最近在开发一个线下销售的东东,这个系统分为管理员端,省代端,客户端,门店端,销售端, 部门端,部门 ...

  8. <实训|第九天>掌握linux中普通的权限控制和三种特殊的权限(sst),做合格的运维工程师

    linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经 ...

  9. Spring Boot 之 RESRful API 权限控制

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “简单,踏实~ 读书写字放屁” 一.为何用RESTful API 1.1 RESTful是什么? ...

随机推荐

  1. Visual Studio Debug only user code with Just My Code

    Debug only user code with Just My Code By default, the debugger skips over non-user code (if you wan ...

  2. Linux常用命令,查看树形结构、删除目录(文件夹)、创建文件、删除文件或目录、复制文件或目录(文件夹)、移动、查看文件内容、权限操作

    5.查看树结构(tree) 通常情况下系统未安装该命令,需要yum install -y tree安装 直接使⽤tree显示深度太多,⼀般会使⽤ -L选项⼿⼯设定⽬录深度 格式:tree -L n [ ...

  3. 《JavaScript DOM编程艺术》:+= 相加之后再赋值

    第2章  第20页 += var year = 2010; var message = "The year is"; message += year; message += yea ...

  4. sort方法和自定义比较器的写法

    摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collections.sort()方法.对自定义对象排序 ...

  5. 【做题记录】CF1444A Division

    CF1444A Division 题意: 给定 \(t\) 组询问,每组给两个数 \(p_i\) 和 \(q_i\) ,找出最大的整数 \(x_i\) ,要求 \(p_i\) 可被 \(x_i\) 整 ...

  6. 字符串与模式匹配算法(一):BF算法

    一.BF算法的基本思想 BF(Brute Force)算法是模式匹配中最简单.最直观的算法.该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐 ...

  7. 最小的K个数 牛客网 剑指Offer

    最小的K个数 牛客网 剑指Offer 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. class Solution ...

  8. java容器之HashMap

    HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的. 解决哈希冲突的三个方法: a.开放 ...

  9. 谷歌chrome多个相同用户登陆同一个机器多开配置

    创建快捷方式,目标中填写:路径+参数如下所示即可 参数:--user-data-dir=%LOCALAPPDATA%\Google\Chrome\%SessionName%

  10. oracle 数据库修改端口号1521

    1.关闭监听 2.修改配置文件,port=1933 #vi $ORACLE_HOME/network/admin/listener.ora 3.登录并查看local_listener参数,因为使用的是 ...