不會(huì)處理鑒權(quán)?那用 Casbin 吧,快速了解入門
本文轉(zhuǎn)載自微信公眾號(hào)「GoLang全?!?,作者錕。轉(zhuǎn)載本文請(qǐng)聯(lián)系GoLang全棧公眾號(hào)。
稍微大一點(diǎn)的項(xiàng)目就一定會(huì)涉及到權(quán)限管理,這個(gè)系列我們給大家介紹一個(gè)非常好用的鑒權(quán)庫(kù) casbin。
它是一個(gè)跨平臺(tái)的庫(kù),支持很多種語言的鑒權(quán)。
官方文檔:https://casbin.org/docs/zh-CN/overview
光講解這個(gè)庫(kù)的 API 很顯然是枯燥的,所以我會(huì)結(jié)合 Gin,模擬實(shí)際開發(fā)中的鑒權(quán)去給大家講解他的使用。
所以我們的工程里面會(huì)用到到的庫(kù)如下:
- go get github.com/casbin/casbin/v2
- go get github.com/gin-gonic/gin
配套Github代碼
很開心的告訴大家,這個(gè)系列的文章我們會(huì)把代碼開源到 Github 上,為大家學(xué)習(xí)的路上掃平一切障礙。
我們官方的 Github 代碼閱讀,地址如下:
- https://github.com/GoLangStackDev/casbin-with-mysql-go.git
本文配套 tag 標(biāo)記:快速入門
快速入門
來一份入門代碼:
- package main
- import (
- "github.com/casbin/casbin/v2"
- "fmt"
- )
- func main() {
- sub := "lili"
- obj := "/posts"
- act := "GET"
- e,err := casbin.NewEnforcer("resources/model.conf","resources/policy.csv")
- checkError(err)
- ok,err := e.Enforce(sub,obj,act)
- checkError(err)
- if ok {
- fmt.Println("通過!")
- }else{
- fmt.Println("不通過!")
- }
- }
- // 統(tǒng)一錯(cuò)誤檢查
- func checkError(err error) {
- if err!=nil {
- println(err.Error())
- }
- }
我定義了一個(gè)方法 checkError 來統(tǒng)一處理報(bào)錯(cuò)。
這里面涉及到兩個(gè)配置文件,分別是 model.conf 和 policy.csv 文件。
內(nèi)容如下:
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
policy.csv
- p, member, /posts, GET
- p, member, /posts/:id, GET
- p, admin, /posts, POST
- p, admin, /posts/:id, PUT
- p, admin, /posts/:id, DELETE
- g, admin, member
- g, super, admin
- g, lili, member
這兩個(gè)配置文件你現(xiàn)在就暫時(shí)先理解為 model.conf 定義了匹配規(guī)則,policy.csv 定義了權(quán)限組等權(quán)限。
具體的解釋我們會(huì)在下一篇文章詳細(xì)介紹。
直接運(yùn)行起來,你會(huì)看到控制臺(tái)輸出:
- 通過!
假如此時(shí)我們把 act 改成 POST 就不能通過了。
沒錯(cuò) act 就表示我們的請(qǐng)求方法。