golang gin 基於 Casbin 實現權限控制

最近在使用 golang gin 開發一套公司內部的人事管理系統,但是發現權限管理比之前搞的系統要複雜不少, 所以我想借機瞭解一下傳說中的 Casbin 權限控制庫,看看是否可以借鑑一下。

涉及權限控制的需求場景

現有 gin route group 的缺陷

總感覺,我目前實用的 gin route group + middleware 的方式,無法滿足複雜的權限控制需求。 而且對於粒度更細的權限控制,無法做到靈活的配置。

我目前實現的系統,都是基於角色的權限控制。即每個角色對應一組權限。 還是不太靈活。

當然根源是,gin 沒有內置權限控制的功能,我自己實現的這套感覺很亂。我不知道規範的做法是怎樣的。 所以,需要找個開源的權限控制庫,學習參考一下。

Casbin 示例

policy.csv 文件內容

p, alice, /api/*, read
p, bob, /version, write

預定義一些策略,也可以存儲到數據庫, alice 可以訪問所有 /api 開頭的路徑,bob 只能訪問 /version 路徑。

go 代碼

// 加載模型與策略,也可以存儲到數據庫
e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")

sub := "alice" // the user that wants to access a resource.
obj := "data1" // the resource that is going to be accessed.
act := "read" // the operation that the user performs on the resource.

ok, err := e.Enforce(sub, obj, act) //判斷用戶是否有權限

實際使用中,e.Enforce() 方法通常會在中間件 (middleware) 中調用,以便在處理請求之前進行權限檢查。

參考:

https://juejin.cn/post/7108533587292454949

Casbin 的功能簡介

一種基於元模型的訪問控制策略描述語言 PML (PERM modeling language) 及其實施機制 PML-EM (PML enforcement mechanism)

參考論文:

https://www.jos.org.cn/jos/article/pdf/5624

一些術語

Casbin 入門介紹

https://casbin.org/docs/tutorials/

裏面有一堆高質量的介紹文檔,找幾篇讀讀,就能有個大概的瞭解。剩下的就是動手測試一下了。

Request 原語

一個訪問請求通常由經典的三元組構成:

Policy 原語 (策略規則) 類似,也是這三個部分。

ACL (Access Control List) 與 RBAC (Role-Based Access Control),ABAC (Attribute-Based Access Control) 的區別

參考:

https://github.com/xizhibei/blog/issues/101

多租戶的支持

參考:

https://www.cnblogs.com/wang_yb/p/9987397.html

策略規則 Policy 存儲到數據庫的方法

保存到 CSV 不是一個好的選擇,應該存儲到數據庫中。這樣可以更靈活地管理和查詢策略規則。

否則,每次都需要登錄服務器,修改 CSV 文件,然後重啓服務,才能生效。這樣不夠靈活。

參考:

https://casbin.org/zh/docs/policy-storage/

這裏支持 Gorm MySQL 的適配器:

https://casbin.org/zh/docs/adapters

實際場景實用

https://www.cnblogs.com/studyzy/p/11380736.html

gin middleware 插件

https://casbin.org/zh/docs/middlewares

這裏推薦了兩個插件 authz (這個居然是 gin 官方的,不可思議) 和 go-casbin, 不過這麼簡單的 middleware,我感覺並不需要三方的實現。 不過可以參考一下代碼。

感想

今天就到這裏吧,實在看不下去了,太枯燥了。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bRgdxew0sV-jqtIMbiWe3g