不會處理鑒權?那用 Casbin 吧,快速了解入門
本文轉載自微信公眾號「GoLang全棧」,作者錕。轉載本文請聯系GoLang全棧公眾號。
稍微大一點的項目就一定會涉及到權限管理,這個系列我們給大家介紹一個非常好用的鑒權庫 casbin。
它是一個跨平臺的庫,支持很多種語言的鑒權。
官方文檔:https://casbin.org/docs/zh-CN/overview
光講解這個庫的 API 很顯然是枯燥的,所以我會結合 Gin,模擬實際開發中的鑒權去給大家講解他的使用。
所以我們的工程里面會用到到的庫如下:
- go get github.com/casbin/casbin/v2
- go get github.com/gin-gonic/gin
配套Github代碼
很開心的告訴大家,這個系列的文章我們會把代碼開源到 Github 上,為大家學習的路上掃平一切障礙。
我們官方的 Github 代碼閱讀,地址如下:
- https://github.com/GoLangStackDev/casbin-with-mysql-go.git
本文配套 tag 標記:快速入門
快速入門
來一份入門代碼:
- 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("不通過!")
- }
- }
- // 統一錯誤檢查
- func checkError(err error) {
- if err!=nil {
- println(err.Error())
- }
- }
我定義了一個方法 checkError 來統一處理報錯。
這里面涉及到兩個配置文件,分別是 model.conf 和 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
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
這兩個配置文件你現在就暫時先理解為 model.conf 定義了匹配規則,policy.csv 定義了權限組等權限。
具體的解釋我們會在下一篇文章詳細介紹。
直接運行起來,你會看到控制臺輸出:
- 通過!
假如此時我們把 act 改成 POST 就不能通過了。
沒錯 act 就表示我們的請求方法。