面試官:說(shuō)說(shuō) Casbin 配置文件里的設(shè)計(jì)哲學(xué)
學(xué)習(xí) casbin 的最大攔路虎就是他的兩個(gè)配置文件,很多新手完全是蒙圈的。
這里我們以本地化權(quán)限控制為例,不直接上數(shù)據(jù)庫(kù)化的,便于大家調(diào)試?yán)斫狻?/p>
我們?cè)谑褂?casbin 時(shí)需要用到兩個(gè)配置文件,分別是 model.conf 和 policy.csv。
他們分別記錄了,權(quán)限匹配規(guī)則也叫模型定義文件 model.conf ,以及權(quán)限列表也叫策略文件 policy.csv。
一、模型定義文件 model.conf
- [request_definition]
- r = sub, obj, act
- [policy_definition]
- p = sub, obj, act
- [role_definition]
- g = _, _
- [policy_effect]
- e = some(where (p.eft == allow))
- [matchers]
- m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
簡(jiǎn)單解釋下這些定義的意義:
[request_definition]
這是關(guān)于請(qǐng)求的一些定義,分別定義了:
訪問(wèn)實(shí)體 (Subject),訪問(wèn)資源 (Object) 和訪問(wèn)方法 (Action)
這個(gè)很好理解:我們一般描述一條請(qǐng)求大都會(huì)這么描述:
哪個(gè)用戶用啥方法請(qǐng)求了某個(gè)資源
這里的:
哪個(gè)用戶→就是 實(shí)體 (Subject)
啥方法→就是 訪問(wèn)方法 (Action)
某個(gè)資源 → 訪問(wèn)資源 (Object)
比如:admin 用戶使用 GET 方法訪問(wèn) /user/list 接口
[policy_definition]
這是是對(duì)策略的定義。
我們還有一個(gè)配置文件 policy.csv ,這里就是約束里面定義些什么字段。
我們一般描述一個(gè)權(quán)限是這樣的:
誰(shuí)擁有對(duì)某個(gè)資源的啥權(quán)限
這里的:
誰(shuí)→就是 實(shí)體 (Subject)
啥權(quán)限→就是 訪問(wèn)方法 (Action)
某個(gè)資源 → 訪問(wèn)資源 (Object)
比如:admin 組擁有 /user/list 接口的 GET 權(quán)限
[policy_effect]
這是對(duì)策略的定義。
我們?cè)?request_definition 和 policy_definition 定義的這些資源,怎么去匹配。
不同的需求可以寫成不同的方式,這里我們寫成 RBAC 權(quán)限控制的經(jīng)典方案:
- e = some(where (p.eft == allow))
p.eft 代表決策結(jié)果。
其意思就是:如果存在一個(gè)匹配的策略規(guī)則就通過(guò)。
[role_definition]
這是角色的定義。
_, _ 表示角色繼承關(guān)系的前項(xiàng)和后項(xiàng),即前項(xiàng)繼承后項(xiàng)角色的權(quán)限。
就像 編輯 權(quán)限只有對(duì)文章的讀寫權(quán)限,管理員擁有 編輯 的全部權(quán)限,這種繼承關(guān)系。
[matchers]
請(qǐng)求和策略的匹配規(guī)則。
先來(lái)解釋下:
- r.obj == p.obj && r.act == p.act
這段就是在匹配的時(shí)候,請(qǐng)求傳過(guò)來(lái)的 obj 和 我們策略組里面的 obj 要匹配到,同樣是 act 也是同樣。
最后來(lái)解釋:
- g(r.sub, p.sub)
g 所關(guān)聯(lián)的是角色定義,所以他要滿足我們的前項(xiàng)繼承后項(xiàng)角色的權(quán)限。
二、策略文件 policy.csv
- p, member, /depts, GET
- p, member, /depts/:id, GET
- p, admin, /depts, POST
- p, admin, /depts/:id, PUT
- p, admin, /depts/:id, DELETE
- g, admin, member
- g, super, admin
- g, lili, member
一看到 .csv 文件,就應(yīng)該能想到,他是一種特殊的文件,我們很多從數(shù)據(jù)庫(kù)里面導(dǎo)出數(shù)據(jù)就會(huì)導(dǎo)出這個(gè)格式的文件。
所以這部分的內(nèi)容后期也可以從數(shù)據(jù)庫(kù)里面去讀取。
這個(gè)文件很好理解,結(jié)合上一個(gè)模型文件:
p 是定義資源的策略的
簡(jiǎn)而言之:誰(shuí)擁有對(duì)某個(gè)資源的啥權(quán)限
g 是定義權(quán)限組的
簡(jiǎn)而言之:誰(shuí)繼承誰(shuí)的權(quán)限






