概念:

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. python T1119紧急措施

    2021-10-18 题目: 近日,一些热门网站遭受黑客入侵,这些网站的账号.密码及 email 的数据惨遭泄露.你在这些网站上注册若干账号(使用的用户名不一定相同),但是注册时使用了相同的 emai ...

  2. vue3.x自定义组件双向数据绑定v-model

    vue2.x 语法 在 2.x 中,在组件上使用 v-model 相当于绑定 value prop 并触发 input 事件: <ChildComponent v-model="pag ...

  3. Redis:学习笔记-02

    Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...

  4. AIApe问答机器人Scrum Meeting 4.27

    Scrum Meeting 3 日期:2021年4月27日 会议主要内容概述:汇报两日工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明昕 后端 Tas ...

  5. Flutter应用在夜神模拟器启动白屏问题

    Flutter应用在夜神模拟器启动白屏问题 flutter run  出现如下错误 [ERROR:flutter/shell/gpu/gpu_surface_gl.cc(39)] Failed to ...

  6. 种类并查集(维护敌人的敌人是朋友)、并行-poj1182-食物链 笔记

    题意 输入若干组数据,代表着不同动物在食物链的位置(A,B,C),要求出在输入的过程中有多少组数据会与之前矛盾. 思路(借鉴挑战程序设计竞赛) 这题是学并查集时的题,所以用了并查集. 一开始我想的是, ...

  7. objdump--反汇编查看

    转载:objdump命令_Linux objdump 命令用法详解:显示二进制文件信息 (linuxde.net) objdump命令 编程开发 objdump命令是用查看目标文件或者可执行的目标文件 ...

  8. P4430 小猴打架

    P4430 小猴打架 题目意思就是让你求,在网格图中(任意两点都有边)的生成树的个数(边的顺序不同也算不同的方案). 首先我们考虑一个生成树,由于一定有n-1条边,单单考虑添加边的顺序,根据乘法原理, ...

  9. Python常用的数据文件存储的4种格式(txt/json/csv/excel)及操作Excel相关的第三方库(xlrd/xlwt/pandas/openpyxl)(2021最新版)

    序言:保存数据的方式各种各样,最简单的方式是直接保存为文本文件,如TXT.JSON.CSV等,除此之外Excel也是现在比较流行的存储格式,通过这篇文章你也将掌握通过一些第三方库(xlrd/xlwt/ ...

  10. Firefox火狐浏览器提示您的链接并不安全(解决办法)

    火狐浏览器不管访问什么,一直提示连接不安全 解决办法: 1.在Firefox地址栏输入"about:config",回车,进入如下图页面 点击"我了解此风险" ...