Golang Casbin库 执行授权&权限控制 学习笔记

一、Casbin模型基础

1、PERM元模型

        subject (sub访问实体),object(obj访问的资源)和action(act访问方法) eft(策略结果 一般为空 默认指定 allow)

        (1)Policy策略

                p={sub,obj,act,eft}

                策略一般存储到数据库,因为有很多策略

                p = sub,obj,act

        (2)Matchers 匹配规则

                Request和Policy的匹配规则

                m = r.sub == p.sub && r.act == p.act && r.obj == p.obj

                r 请求 p 策略

                这时候会把 r 和 p 按照上述描述进行匹配,从而返回匹配结果(eft)如果不定义 会返回         allow 如果 定义过了 会返回我们定义过的那个结果

        (3)Request 请求

                r = {sub,obj,act}

        (4)Effect 影响

                他决定我们是否可以放行

                        e = some(where(p.eft == allow)) 这种情况下我们的一个mathers匹配完成得到了                        allow 那么这条请求将被放行

                        e = some(where(p.eft == allow)) && !some(where(p.eft == deny))

                这里的规则是定死的

[request_definition]
r = sub, obj, act    //形参  定义参数

[policy_definition]
p = sub, obj, act    //形参  策略

[policy_effect]
e = some(where (p.eft == allow))   //我们匹配到最终结果之后,能否通过这个表达式是得到bool值

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act    //入参 r和p的对应关系

2、role_definition角色域

        g = _,_ 表示以角色为基础  (g = 用户,角色)

        g = _,_,_ 表示以域为基础(多商户模式)

[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

Policy

p, alice, data1, read
p, bob, data2, write
p, data2_admin, data2, read  //或者alice, data2, read也是可以通过的
p, data2_admin, data2, write

g, alice, data2_admin

Request

        alice, data2, read  通过最后一句g(r.sub, p.sub)——> data2_admin, data2, read 

         g(r.sub, p.sub)是让 r.sub 和 p.sub 通用起来

        可以通过

 二、多租户模型

[request_definition]r = sub,dom,obj,act

入参(实体,域【商户】,资源,方法)

[policydefinitionp=subdomobiact

权限模型(实体,域【商户】,资源,方法)

[role_definition]g=_,_,_

域匹配规则后面g会说这里意思是g收三个参数(用户,角色,商户)

[policy effect]e=some(where(p.eft==allow))

看看经过下面那些个匹配规则后的返回值是否等于里面那个allow

[matchers]m=g(r.sub,p.sub,r.dom)&&r.dom==p.dom&&r.obj==p.obj&&r.act==p.act

先列出来一个权限定义里面的东西

g.qmteacher,classOne

然后用g做一些解析动作

一般我们会收到前端的入参大概长这样"qm","classOne","/base/api","get"

上面我们定义的g就是我们需要的模型 经过g以后 g已经把我们的入参 qm 解析成了r.sub 为

teacher r.rom 为 classOne 先从这个商户找一下角色 找到就过了 然后用 dom 去匹配然后用一个类

似于这样的请求 去策略里面找teacher,classOne/api/base.get

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值