Casbin Gin Gorm 學習探索

2022-08-18 18:27:11 字數 3882 閱讀 2346

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]

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 直接通過, 不驗證許可權

在理解了casbin 的工作原理後,實際寫**測試一下

需要使用的外部包

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 雖然都只是皮毛 不過 算是了解那麼一點點吧 哈哈 我還突然發現 我的 數學和英語 進步了不少 而且還都是很實用的 比在學校的進步可快多了 那句話說的很不錯 在你了解了一些皮毛之後你會發現很多東西你都必須去學。因為少一...