Casbin 使用記錄


Casbin 是什么?

官方解釋:Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型

Casbin只負責訪問控制。身份認證 authentication(即驗證用戶的用戶名、密碼),需要其他專門的身份認證組件負責。例如(jwt-go)

 

兩個核心概念:

訪問控制模型model和策略policy。

 

工作原理:

Casbin把  訪問控制模型  被抽象為基於 

PERM元模型 (Policy, Effect, Request, Matchers) [策略,效果,請求,匹配器]

PERM(Policy, Effect, Request, Matchers)模型很簡單, 但是反映了權限的本質 – 訪問控制

  • Policy: 定義權限的規則
  • Effect: 定義組合了多個 Policy 之后的結果, allow/deny
  • Request: 訪問請求, 也就是誰想操作什么
  • Matcher: 判斷 Request 是否滿足 Policy

匹配來源:定義的 request 和 存儲的 police 比對判斷。

所有 model file 中主要就是定義 PERM 4 個部分。

的一個文件( model.conf , 這個文件一般是固定的)。 因此,切換或升級項目的授權機制與修改配置一樣簡單。 您可以通過組合可用的模型來定制您自己的訪問控制模型(ACL, RBAC,  ABAC)。 例如,您可以在一個model中獲得RBAC角色和ABAC屬性,並共享一組policy規則。

Casbin中最基本、最簡單的model是ACL。ACL中的model CONF為:

# 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

  g, g2, g3 表示不同的 RBAC 體系, _, _ 表示用戶和角色 _, _, _ 表示用戶, 角色, 域(也就是租戶)

ACL model的示例policy如下:

p, alice, data1, read
p, bob, data2, write

  

Model 語法:

  • Model CONF 至少應包含四個部分: [request_definition], [policy_definition], [policy_effect], [matchers]

  • 如果 model 使用 RBAC, 還需要添加[role_definition]部分

policy 不同,model 只能加載,不能保存。 因為我們認為 model 不是動態組件,不應該在運行時進行修改,所以我們沒有實現一個 API 來將 model 保存到存儲中.

 

policy file

定義具體的策略, 權限的檢查就是基於定義的 model file 和 policy file 來完成的.

相對於 model file 定義規則, policy file 中定義的就是具體的內容.

 

如何使用?

創建一個Casbin決策器需要有一個模型文件和策略文件為參數:

import "github.com/casbin/casbin"

e := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")

  

在訪問發生之前, 在代碼中添加強制掛鈎:(這一步就是校驗訪問控制權,然后根據返回值做對象的分之操作)

sub := "alice" // the user that wants to access a resource.
obj := "data1" // the resource that is going to be accessed.
act := "read" // the operation that the user performs on the resource.

if e.Enforce(sub, obj, act) == true {
    // permit alice to read data1
} else {
    // deny the request, show an error
}

  

 casbin 存儲到數據庫的記錄是策略, 訪問控制模型當系統確定戶基本很少改動。可以存儲到項目配置文件(本地)

 casbin 存儲RBAC方案中用戶和角色之間的映射關系。(而這個關系是基於 midel 訪問控制模型)

權限管理系統最好全局依賴 一個Casbin 決策器(這個決策器 依賴 模型文件和策略文件為參數)

在訪問發生之前,在代碼中加入強制鈎子,控制。

 

這個請求格式是可以自定義的, 默認為默認的請求格式為 { subject, object , action }

 

sub := "alice" // the user that wants to access a resource.
obj := "data1" // the resource that is going to be accessed.
act := "read" // the operation that the user performs on the resource.

if e.Enforce(sub, obj, act) == true {
    // permit alice to read data1
} else {
    // deny the request, show an error
}

  

Casbin 模型可以是多個組合。也可以共享同一組policy規則。

數據庫里存儲的 策略 第一個字段代表的是在 model 里定義的模型類型。

p, alice, data1, read  其中的 p 是在 model.conf 文件中定義好的。

 

多租戶示例

定義 model file

[request_definition]
r = sub, dom, obj, act // 這里定義的是請求格式

[policy_definition]
p = sub, dom, obj, act // 這里定義的是策略格式模型

[role_definition]
g = _, _, _           // 這里定義的也是策略的一種模型

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

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

  

Cabin 沒有驗證用戶是否是有效的用戶,或者角色是一個有效的角色。 這應該通過認證來解決。

 

參考資料:https://www.cnblogs.com/xiaohunshi/p/10372881.html

     https://www.cnblogs.com/wang_yb/archive/2018/11/20/9987397.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM