casbin-初識(shí)

簡(jiǎn)介

權(quán)限管理在幾乎每個(gè)系統(tǒng)中都是必備的模塊裂明。如果項(xiàng)目開(kāi)發(fā)每次都要實(shí)現(xiàn)一次權(quán)限管理,無(wú)疑會(huì)浪費(fèi)開(kāi)發(fā)時(shí)間太援,增加開(kāi)發(fā)成本闽晦。因此,casbin庫(kù)出現(xiàn)了提岔。casbin是一個(gè)強(qiáng)大仙蛉、高效的訪問(wèn)控制庫(kù)。支持常用的多種訪問(wèn)控制模型碱蒙,如ACL/RBAC/ABAC等荠瘪。可以實(shí)現(xiàn)靈活的訪問(wèn)權(quán)限控制赛惩。同時(shí)巧还,casbin支持多種編程語(yǔ)言,Go/Java/Node/PHP/Python/.NET/Rust.

安裝

go get github.com/casbin/casbin/v2

權(quán)限實(shí)際上就是控制誰(shuí)能對(duì)什么資源進(jìn)行什么操作坊秸。casbin將訪問(wèn)控制模型抽象到一個(gè)基于 PERM(Policy麸祷,Effect,Request褒搔,Matchers) 元模型的配置文件(模型文件)中阶牍。因此切換或更新授權(quán)機(jī)制只需要簡(jiǎn)單地修改配置文件喷面。

  • policy是策略或者說(shuō)是規(guī)則的定義。它定義了具體的規(guī)則走孽。

  • request是對(duì)訪問(wèn)請(qǐng)求的抽象惧辈,它與e.Enforce()函數(shù)的參數(shù)是一一對(duì)應(yīng)的

  • matcher匹配器會(huì)將請(qǐng)求與定義的每個(gè)policy一一匹配,生成多個(gè)匹配結(jié)果磕瓷。

  • effect根據(jù)對(duì)請(qǐng)求運(yùn)用匹配器得出的所有結(jié)果進(jìn)行匯總盒齿,來(lái)決定該請(qǐng)求是允許還是拒絕

模型文件 (model.conf)

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

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

上面模型文件規(guī)定了權(quán)限由sub,obj,act三要素組成困食,只有在策略列表中有和它完全相同的策略時(shí)边翁,該請(qǐng)求才能通過(guò)。匹配器的結(jié)果可以通過(guò)p.eft獲取硕盹,some(where (p.eft == allow))表示只要有一條策略允許即可符匾。

策略文件 (policy.csv)

p, person1, data1, read
p, person2, data2, write

上面的策略文件規(guī)定了person1對(duì)data1有read權(quán)限,而person2對(duì)data2有write權(quán)限

package main

import (
 "fmt"
 "log"

 "github.com/casbin/casbin/v2"
)

func check(e *casbin.Enforcer, sub, obj, act string) {
 ok, _ := e.Enforce(sub, obj, act)
 if ok {
   fmt.Printf("%s CAN %s %s\n", sub, act, obj)
 } else {
   fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
 }
}

func main() {
 e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
 if err != nil {
   log.Fatalf("NewEnforecer failed:%v\n", err)
 }

 check(e, "person1", "data1", "read")
 check(e, "person2", "data2", "write")
 check(e, "person1", "data1", "write")
 check(e, "person2", "data2", "read")
}

運(yùn)行結(jié)果

person1 CAN read data1
person2 CAN write data2
person1 CANNOT write data1
person1 CANNOT read data2

RBAC

RBAC(role-based-access-control)模型通過(guò)引入角色(role)這個(gè)中間層來(lái)解決這個(gè)問(wèn)題。每個(gè)用戶都屬于一個(gè)角色瘩例,例如開(kāi)發(fā)者啊胶、管理員、運(yùn)維等垛贤,每個(gè)角色都有其特定的權(quán)限焰坪,權(quán)限的增加和刪除都通過(guò)角色來(lái)進(jìn)行。這樣新增一個(gè)用戶時(shí)聘惦,我們只需要給他指派一個(gè)角色某饰,他就能擁有該角色的所有權(quán)限。修改角色的權(quán)限時(shí)部凑,屬于這個(gè)角色的用戶權(quán)限就會(huì)相應(yīng)的修改露乏。

在model中定義
[role_definition]
g = _, _

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

g _ , _表示前面的角色繼承后面的角色,并擁有后面角色的權(quán)限

示例

p, admin, data, read
p, admin, data, write
g, person, admin

person擁有的權(quán)限,對(duì)data有write和read權(quán)限

ABAC

  • RBAC模型對(duì)于實(shí)現(xiàn)比較規(guī)則的、相對(duì)靜態(tài)的權(quán)限管理非常有用涂邀。
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[matchers]
m = r.sub.Hour >= 9 && r.sub.Hour < 18 || r.sub.Name == r.obj.Owner

[policy_effect]
e = some(where (p.eft == allow))
type Object struct {
  Name  string
  Owner string
}

type Subject struct {
  Name string
  Hour int
}

func check(e *casbin.Enforcer, sub Subject, obj Object, act string) {
  ok, _ := e.Enforce(sub, obj, act)
  if ok {
    fmt.Printf("%s CAN %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
  } else {
    fmt.Printf("%s CANNOT %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
  }
}

func main() {
  e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
  if err != nil {
    log.Fatalf("NewEnforecer failed:%v\n", err)
  }

  o := Object{"data", "dajun"}
  s1 := Subject{"dajun", 10}
  check(e, s1, o, "read")

  s2 := Subject{"lizi", 10}
  check(e, s2, o, "read")

  s3 := Subject{"dajun", 20}
  check(e, s3, o, "read")

  s4 := Subject{"lizi", 20}
  check(e, s4, o, "read")
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘟仿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子比勉,更是在濱河造成了極大的恐慌劳较,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浩聋,死亡現(xiàn)場(chǎng)離奇詭異观蜗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)衣洁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門墓捻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坊夫,你說(shuō)我怎么就攤上這事砖第〕仿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵梧兼,是天一觀的道長(zhǎng)放吩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)羽杰,這世上最難降的妖魔是什么渡紫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮考赛,結(jié)果婚禮上惕澎,老公的妹妹穿的比我還像新娘。我一直安慰自己欲虚,他們只是感情好集灌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布悔雹。 她就那樣靜靜地躺著复哆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腌零。 梳的紋絲不亂的頭發(fā)上梯找,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音益涧,去河邊找鬼锈锤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛闲询,可吹牛的內(nèi)容都是我干的久免。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扭弧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阎姥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鸽捻,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呼巴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后御蒲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體衣赶,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年厚满,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了府瞄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碘箍,死狀恐怖遵馆,靈堂內(nèi)的尸體忽然破棺而出续崖,到底是詐尸還是另有隱情,我是刑警寧澤团搞,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布严望,位于F島的核電站,受9級(jí)特大地震影響逻恐,放射性物質(zhì)發(fā)生泄漏像吻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一复隆、第九天 我趴在偏房一處隱蔽的房頂上張望拨匆。 院中可真熱鬧,春花似錦挽拂、人聲如沸惭每。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)台腥。三九已至,卻和暖如春绒北,著一層夾襖步出監(jiān)牢的瞬間黎侈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工闷游, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留峻汉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓脐往,卻偏偏與公主長(zhǎng)得像休吠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子业簿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容