casbin 是乙個強大的,開源的訪問控制框架,許可權管理機制支援多種訪問控制模型; 並且支援多種程式語言;
gin golang 的 web 框架,短小精悍
gorm golang 的 orm 框架
今天我們要學習的是如何通過casbin 來控制開發的 api 訪問許可權
##### casbin 工作原理
訪問控制模型被抽象為perm(policy,effect,request,matcher) 的乙個檔案,如果切換專案的授權機制只用修改檔案即可;
policy: 定義許可權的規則
effect: 定義組合多個policy 後是允許還是拒絕(allow/deny)
request: 訪問的請求,可以理解為誰想訪問什麼資源
matcher:判斷request 是否滿足policy ,返回true或false
##### 在使用casbin 控制後台介面時使用以下模型
[request_definition]在理解了casbin 的工作原理後,實際寫**測試一下r =sub, obj, act
# 請求的規則
# r 是規則的名稱,sub 為請求的實體,obj 為資源的名稱, act 為請求的實際操作動作
[policy_definition]
p =sub, obj, act
# 策略的規則
# 同請求
[role_definition]
g =_, _
# 角色的定義
# g 角色的名稱,第乙個位置為使用者,第二個位置為角色,第三個位置為域(在多租戶場景下使用)
[policy_effect]
e = some(where (p.eft ==allow))
# 任意一條 policy rule 滿足, 則最終結果為 allow
[matchers]
m = g(r.sub, p.sub) == true
\ && keymatch2(r.obj, p.obj) == true
\ && regexmatch(r.act, p.act) == true
\ || r.sub == "
root
"# 前三個用來匹配上面定義的請求的規則, 最後乙個或條件為:如果實體是root 直接通過, 不驗證許可權
需要使用的外部包
go get github.com/casbin/casbin casbin 官方庫
go get github.com/casbin/gorm-adapter casbin 外掛程式,用來將規則和策略儲存到資料庫中
go get github.com/gin-gonic/gin go web 框架
go get github.com/go-sql-driver/mysql go mysql 驅動
// 統一響應結構體
type response
struct
`json:"
data"`
}var o *gorm.db
var po *gormadapter.adapter
var enforcer *casbin.enforcer
func ping(c *gin.context)
//資料庫連線及角色規則的初始化
func connect()
// 將資料庫連線同步給外掛程式, 外掛程式用來運算元據庫
po =gormadapter.newadapterbydb(o)
// 這裡也可以使用原生字串方式
// enforcer = casbin.newenforcer("
./auth_model.conf
", po)
// 開啟許可權認證日誌
enforcer.enablelog(
true
)// 載入資料庫中的策略
err =enforcer.loadpolicy()
if err !=nil
//建立乙個角色,並賦於許可權
// admin 這個角色可以訪問get 方式訪問 /api/v2/ping
res := enforcer.addpolicy("
admin
","/api/v2/ping
","get")
if !res
else
//將 test 使用者加入乙個角色中
enforcer.addroleforuser("
test
","root")
enforcer.addroleforuser("tom","admin")
//請看規則中如果使用者名為 root 則不受限制
}func main()
// 介面使用許可權認證中介軟體
version2 := g.group("
/api/v2
", casbinmiddleware)
_ = g.run("
:8099")
}//casbin middleware 許可權認證中介軟體
func casbinmiddleware(c *gin.context) )
c.abort()
return
}
//請求的path
p :=c.request.url.path
//請求的方法
m :=c.request.method
// 這裡認證
res,err :=enforcer.enforcesafe(username,p,m)
//這個 haspermissionforuser 跟上面的有什麼區別
// enforcesafe 會驗證角色的相關的許可權
// 而 haspermissionforuser 只驗證使用者是否有許可權
//res = enforcer.haspermissionforuser(username,p,m)
if err !=nil )
c.abort()
return
}
if !res )
c.abort()
return
} c.next()
}程式執行後資料庫資料為
p 代表的是策略 admin 角色可以使用get 訪問 /api/v2/ping
g 代表的是角色 test 使用者在root 角色中
tom 在admin 角色中
所以在測試時請求頭
username = root 有正常響應 (這裡不會到資料庫驗證,策略最後一條)
username = tom 正常響應 (tom 有admin 角色 , 所以驗證通過)
username = role_admin 正常響應 (參考這裡: , 正常情況下使用者名稱和角色名稱不應該一樣)
username = *** 都無法通過認證
最後, 一般的後台開發不會這樣設計, 後面繼續學習,理解 casbin 工作原理,為以後開發打下基礎;
學習學習再學習
如果乙個技能足夠複雜 比如從零學程式設計 那就不要指望讀完一本書就可以打天下。多買幾本書同類的書 因為每個作者的出發點是不一樣的,哪怕對同乙個概念都有不同的解釋說明。理解知識的重要過程之一就如牛的反芻一樣,要嚼一遍 嚥下去 再吐出來 再嚼一遍 再嚥下去 所以,既然一本書可以讀幾遍,那麼同一話題多應該...
學習 學習 再學習
原本要使用vs2005開發乙個b s專案的,沒有想到只能先暫時停停了,居然跟不上技術的發展了,呵呵,一直使用delphi delphi也沒能跟上 沒有想到轉到vs2005上竟然有這麼多要學的東西,當然目的是了做乙個好的系統。最近一直在學習asp.net ajax,雖然專案停了,但是我覺得值得,有很多...
只是學習 學習 再學習
通過做 讓我學會了很多東西 什麼 flash div css html js as 雖然都只是皮毛 不過 算是了解那麼一點點吧 哈哈 我還突然發現 我的 數學和英語 進步了不少 而且還都是很實用的 比在學校的進步可快多了 那句話說的很不錯 在你了解了一些皮毛之後你會發現很多東西你都必須去學。因為少一...