Casbin访问控制框架入门

访问控制是指区分不同用户对不同资源的访问能力,在应用系统中通常叫做权限管理

在做任何多用户系统的时候,用户权限管理都是整个系统中必不可少的部分,并且权限设计要做到既安全又清晰是一件不太容易的事情。

根据不同的场景,权限管理可以设计出各种不同的模型。

今天就给各位介绍一个访问控制框架Casbin以及PERM元模型。

Casbin · An authorization library

元模型 PERM

如果,在做系统设计时,针对每一个资源和每一个用户都编写访问规则将会是一个工作量很大的事情,并且对于动态变化的资源和用户,这样做是不可行的。因此我们需要定义一系列规则,这些规则的组合就是一个访问控制模型。

PERM模型是由4个基础(Policy,Effect,Request,Matchers)描述各个资源和用户之间的相互关系。

Request 请求

定义了请求参数。一个基本的请求是一个元组对象,至少包含subject(访问实体), object(访问的资源)和 action(访问方法)。

r={sub, obj,act}

它其实就是定义了传入访问控制匹配函数的参数名和顺序。

Policy 策略

定义访问策略的模型。其实就是定义Policy规则文档中各字段的名称和顺序。

p={sub, obj, act}p={sub, obj, act, eft}

注意:如果不定义 eft(策略结果),那么将不会去读策略文件中的结果字段,并将匹配的策略结果都默认为allow

Matchers 匹配规则

Request和Policy的匹配规则。
例如: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
这条简单又常见的匹配规则的意思就是,请求的参数(实体、资源和方法)都相等即在策略中能找到,那么返回策略结果(p.eft)。策略结果会保存在p.eft中。

Effect

用于将给定请求与最终结果匹配的策略组合/减少的策略的模型。可以理解为,对Matchers匹配后的结果再进行一次逻辑组合判断的模型。
例如:e = some(where(p.eft == allow))
这句的意思是指,如果匹配策略结果p.eft 存在(some) allow的结果,那么最终结果就为
再看个例子:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
这个例子组合的逻辑含义是:如果有匹配出结果为alllow的策略并且没有匹配出结果为deny的策略则结果为,换句话说,就是匹配的策略都为allow时才为,如果有任何deny,都为 (更简单的说当allowdeny同时存在时,deny优先)

以上时PERM的模型定义的说明,接下来,用Casbin实战一下

Casbin访问控制需要两个东西:访问控制模型文件策略文件,模型文件就是上文描述的内容。

下图说明了如何使用基于 PERM 的模型授权请求。


PERM

创建一个完整的模型文件

创建一个perm.conf文件,内容如下

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act, eft # 这里我们定义了eft,不使用默认值

# Policy effect
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny)) # 这里使用了deny优先

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act #最简单的匹配规则。请求的参数与策略参数一致时获得策略结果

注意代码中的注释

创建一个policy.csv文件, 其中的每个字段的定义就如perm中[policy_definition]中定义的顺序:

p, zeta, data1, read, allow
p, bob, data2, write, allow
p, zeta, data2, write, deny
p, zeta, data2, write, allow

p 代表策略组名称,就是metchers里对应的那个p。后面的zeta,data, read, allow对应的就是策略定义中的sub,obj,act和策略结果eft。

假如,request参数在策略文件中能够匹配(zeta,data1和read),那么结果为allow;
假如,request参数在策略文件中能够匹配(zeta,data2,write),那么结果为deny,同时也匹配另一条策略结果为allow,根据policy_effect的定义,依然识别为

接下来用Go代码检验一下

创建main.go 代码如下:

package main

import (
    “fmt”

    “github.com/casbin/casbin”
)

func main() {
    //通过策略文件和模型配置穿件一个casbin访问控制实例
    e := casbin.NewEnforcer(“./perm.conf”, “./policy.csv”)

    //定义各种sub,obj和act的数组
    subs := []string{“bob”, “zeta”}
    objs := []string{“data1”, “data2”}
    acts := []string{“read”, “write”}

    //遍历组合sub,obj,act并打印出对应策略匹配结果。
    for _, sub := range subs {
        for _, obj := range objs {
            for _, act := range acts {
                fmt.Println(sub, “/“, obj, “/“, act, “=“, e.Enforce(sub, obj, act))
            }
        }
    }

}

这段Go代码很简单,组合每一种sub、obj和act,然后打印出访问控制的结果验证我们的策略文件和模型的设计。

运行结果为:

bob / data1 / read = false
bob / data1 / write = false
bob / data2 / read = false
bob / data2 / write = true
zeta / data1 / read = true
zeta / data1 / write = false
zeta / data2 / read = false
zeta / data2 / write = false

bob的策略很简单,只有data2write结果为allow,因此其余都是false,结果正确;
zetadata1read结果为allow,对data2write同时有allowdenny(根绝policy_effect定义的deny优先),因此结果zeta也只对 data1readtrue,结果正确。

这样,我们就使用Casbin和PERM创建了一个基础的访问控制模型设计和策略。

在实际应用上,如果我们做的是一个Web应用,可以将路由作为obj,请求方式Method作为act,登录用户的角色作为sub,在每一次请求时,把这3个参数传递给e.Enforce, 就可以实现对Web页面和请求接口的权限控制管理,非常方便。

高级

存储

Casbin除了能够通过策略文件和模型配置文件设置访问控制外,还可以适配数据库模式,将策略和模型保存在数据库中,更适合大型复杂的软件系统的权限管理。
model存储
policy存储

函数

文中的模型配置没有使用额外的函数,但是在实际应用中,对与资源的匹配模式,action的匹配模式可能会用到更高级的匹配方法。利用函数是最佳实践方式。
Policy存储 · Casbin

API

Casbin提供给了很多API用于管理 管理 API · Casbin

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 1. 访问控制原理1.1 访问控制策略 2. 主体、客体和访问权 3. 自主访问控制3.1 自主访问控制的主要特点...
    MrDecoder阅读 3,151评论 0 0
  • 引言 引言 在一个典型的软件开发场景中,你作为一名开发人员加入到某个项目后,假设是“超人组”,你往往需要访问这个项...
    张羽辰阅读 11,856评论 6 27
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,813评论 0 5
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 13,841评论 2 64
  • 1.组件和插件介绍 1.1.Ranger介绍 Apache Ranger能够监控和管理整个Hadoop平台的综合数...
    木木与呆呆阅读 1,762评论 0 4