casbin 基本使用以及通俗的解釋(有例子)

大概使用講解

這里用 1.例子基本單位 里面的例子作為講解
@ 具體的使用到的方法(api)去查文檔,這里就給個(gè)例子說(shuō)明他是個(gè)什么東西,有什么作用
你自己保存數(shù)據(jù)(比如存儲(chǔ)在表中的基本數(shù)據(jù)),然后定義 model(策略規(guī)則,里面告訴casbin 怎么判斷是否可訪問的條件),根據(jù)你定義的model,把基本數(shù)據(jù)的所有關(guān)系都存下來(lái)(一般都存著一個(gè)表內(nèi),用對(duì)應(yīng)功能前綴+主鍵id作為內(nèi)容),然后就可以使用casbin 的方法來(lái)判斷是否可訪問
區(qū)別:
原生表的方式:要保存五個(gè)基本單位的相互之間的關(guān)系,需要四個(gè)數(shù)據(jù)庫(kù)的實(shí)際表來(lái)保存,然后每次判斷是否有權(quán)限,就要去查詢出關(guān)系,然后判斷這個(gè)用戶對(duì)應(yīng)的角色是否有該資源的訪問權(quán)限
casbin方式:將所有關(guān)系都存在一起(靠自己維護(hù)),然后獲取用戶的基本信息,用戶信息,資源信息,直接調(diào)用 casbin 方法判斷即可,不用考慮他們之間的關(guān)系和查詢,因?yàn)檫@一步就是 casbin 做了
總的來(lái)說(shuō):
casbin 就是讓你把怎么判斷的規(guī)則定好,然后把數(shù)據(jù)單位的關(guān)系都給他,他根據(jù)你給的規(guī)則,根據(jù)你傳入的參數(shù)(用戶,被訪問的資源等基本參數(shù)),反饋給你true ,fasle

1.例子基本單位(所有單位帶域的標(biāo)識(shí))

一種五種,租戶為特殊,用來(lái)劃分?jǐn)?shù)據(jù)區(qū)域,沒有就代表所有數(shù)據(jù)都在一起
用戶,部門,角色,資源(api等被訪問的,也可稱為規(guī)則),租戶(也可以稱為域)
這些數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)表中

2 基本單位的關(guān)系(如果有域,所有關(guān)系帶域的標(biāo)識(shí))以及 策略存儲(chǔ)關(guān)系

2.1 四種關(guān)系

用戶部門關(guān)系,
部門角色關(guān)系,
用戶角色關(guān)系
角色資源關(guān)系

2.2概述

關(guān)系都存儲(chǔ)在一張表中(load 的時(shí)候都加載進(jìn)來(lái)),其他數(shù)據(jù)都對(duì)應(yīng)單獨(dú)表(用戶,部門,權(quán)限等等,這里只是把關(guān)系都合在一起)
關(guān)系數(shù)據(jù)全都存在一張關(guān)系表中,用來(lái)給casbin 加載到police 中

2.3 兩種數(shù)據(jù)格式( _id 表示對(duì)應(yīng)表的主鍵id)

第一種每個(gè)基本單位之間的關(guān)系,g 開頭表示基本單位的關(guān)系類型,也對(duì)應(yīng)了model 的 role_definition

(g,u_id,d_id,t_id) 用戶(user)和部門(dept)在租戶(ten)下的關(guān)系
(g,u_id,r_id,t_id)用戶(user)和角色(role)在租戶(ten)下的關(guān)系
(g,d_id,r_id,t_id)部門(dept)和角色(role)在租戶(ten)下的關(guān)系

第二種角色對(duì)應(yīng)的功能關(guān)系,p 開頭表示功能關(guān)系,也對(duì)應(yīng)了model 的 policy_definition

(p,r_id,t_id,rule_id,all) 角色(role)在租戶(ten)下有資源(rule)的所有關(guān)系

3.使用模式 adapter 適配器模式(自定義存儲(chǔ)和取數(shù)據(jù)邏輯)

實(shí)現(xiàn)(adapter persist.Adapter)內(nèi)的五個(gè) 方法(相當(dāng)于把對(duì)應(yīng)的police 的操作,同步到數(shù)據(jù)庫(kù)的增刪改查中),具體的邏輯自己定義
比如 LoadPolicy 方法加載所有的關(guān)系數(shù)據(jù)到內(nèi)存中,SavePolicy 方法插入一條關(guān)系數(shù)據(jù)等等

// Adapter is the interface for Casbin adapters.
type Adapter interface {
    // LoadPolicy loads all policy rules from the storage.
    LoadPolicy(model model.Model) error
    // SavePolicy saves all policy rules to the storage.
    SavePolicy(model model.Model) error

    // AddPolicy adds a policy rule to the storage.
    // This is part of the Auto-Save feature.
    AddPolicy(sec string, ptype string, rule []string) error
    // RemovePolicy removes a policy rule from the storage.
    // This is part of the Auto-Save feature.
    RemovePolicy(sec string, ptype string, rule []string) error
    // RemoveFilteredPolicy removes policy rules that match the filter from the storage.
    // This is part of the Auto-Save feature.
    RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error
}

4.model 定義

  [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

5.使用過(guò)程

每次使用,都新建對(duì)應(yīng)對(duì)象 Enforcer 對(duì)調(diào)用 LoadPolicy 該方法,比如(casbin.NewSyncedEnforcer)
LoadPolicy 中獲取所有關(guān)系,加載到內(nèi)存中,然后傳入需要比較的數(shù)據(jù)(這里的例子就是,用戶id,資源id,判斷該用戶是否能請(qǐng)求該資源)調(diào)用 Enforcer 比較即可

6.功能細(xì)化,ALL 權(quán)限約束

提供的 Casbin 模型和策略中,"ALL" 通常用作一個(gè)通配符或特殊標(biāo)記,用來(lái)表示“所有”或“任意”的操作或條件。具體來(lái)說(shuō):

代表所有操作:
在你給出的示例中,ALL 可能表示所有的操作(act),即角色對(duì)某個(gè)資源的所有可能操作都是被允許的。這意味著,不論是讀取、寫入、刪除等操作,都被允許。

簡(jiǎn)化策略管理:
使用 ALL 可以簡(jiǎn)化策略的定義。如果不使用 ALL,你可能需要為每種具體的操作(如 read、write、delete 等)分別定義策略,這樣會(huì)增加策略的數(shù)量和復(fù)雜度。通過(guò)使用 ALL,你可以用一條策略來(lái)覆蓋所有操作。

為什么需要 ALL
靈活性:在某些場(chǎng)景下,你可能希望某個(gè)角色對(duì)某個(gè)資源的所有操作都被允許,而不必分別定義每種操作的策略。這時(shí),ALL 就能提供這種靈活性。
減少策略數(shù)量:使用 ALL 可以減少你需要定義的策略數(shù)量,使管理更為簡(jiǎn)便。

如果要細(xì)化訪問權(quán)限,就將 all 對(duì)應(yīng) 改成 讀(read)寫(write),執(zhí)行(op)等等,然后在執(zhí)行判斷的方法Enforcer 的時(shí)候,參數(shù)對(duì)應(yīng)傳入,查看它是否有對(duì)應(yīng)權(quán)限,比如 原來(lái)是 用戶 18租戶 11下是否有資源45ALL權(quán)限

enforcer.Enforce(u_18,t_11,rule_45, "ALL")

如果細(xì)化,可以變成

enforcer.Enforce(u_18,t_11,rule_45, "WRITE")

細(xì)化成:用戶 18租戶 11下是否有資源45寫權(quán)限
前后不同在于,只不過(guò)記錄的時(shí)候,關(guān)系中要記錄多條,比如,讀寫各一條,操作,復(fù)制各一條等等,有多條關(guān)系數(shù)據(jù),這個(gè)例子 ALL 是簡(jiǎn)化了,實(shí)際邏輯在自己的業(yè)務(wù)中自己處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容