大概使用講解
這里用 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下是否有資源45的ALL權(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ù)中自己處理