实现权限控制_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制
Go語言中文網,致力于每日分享編碼、開源等知識,歡迎關注我,會有意想不到的收獲!
身份認證和授權對 web 應用的安全至關重要。最近,我用 Go 完成了我的第一個正式的 web 應用,這篇文章是在這個過程中我所學到的部分內容。
本文中,我們的關注點在于如何在 web 應用中使用開源的 casbin 庫進行 HTTP 權限控制。同時,在示例代碼中我們使用了 scs 庫進行 session 管理。
下面的例子十分基礎,希望它盡可能的展示了如何在 Go web 應用中實現權限控制。為了更側重于展示 casbin 的使用,我們盡量簡化業務邏輯(例如:不需密碼的登陸操作)。我們一起來看一下!
注意:請不要在生產環境中使用所示的用例代碼,該例子側重于描述清晰,而不是安全性。
建立
首先,我們創建一個 User 模型,并實現了相應方法:
type User struct { ID int Name string Role string}type Users []Userfunc (u Users) Exists(id int) bool { ...}func (u Users) FindByName(name string) (User, error) { ...}接著配置 casbin 所需文件。這里我們需要一個配置文件和一個策略文件。配置文件使用 PERM 元模型。PERM 表示策略(Policy)、效果(Effect)、請求(Request)和匹配器(Matchers)。
在 auth_model.conf 配置文件中有如下內容:
[request_definition]r = sub, obj, act[policy_definition]p = sub, obj, act[policy_effect]e = some(where (p.eft == allow))[matchers]m = r.sub == p.sub && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")其中定義了請求和策略來表示主體,客體和動作。在本例中,主體表示用戶角色,客體表示訪問路徑,action 表示請求方法(例:GET, POST 等)。
匹配器定義了策略是如何匹配的,可以通過直接定義主體,或者使用像 keyMatch 這樣的幫助方法,它也可以匹配通配符。casbin 實際比這個簡單的例子要強大得多,你可以用聲明的方式定義各種自定義功能來達到輕松切換和維護鑒權配置的效果。
在安全性方面,我通常會選擇最簡單的解決方案,因為當系統開始變復雜和難以維護時,錯誤就開始發生。
在這個例子中,策略文件就是一個簡單的 csv 文件,描述了哪些角色可以訪問哪些路徑等。
policy.csv 文件格式如下:
p, admin, /*, *p, anonymous, /login, *p, member, /logout, *p, member, /member/*, *這個配置文件十分簡單。在這個例子中,我們簡單的定義了 admin 角色可以訪問所有內容,member 角色可以訪問以 /member/ 開頭的路徑和 logout 路徑,未認證用戶可以登陸。
這種形式的好處在于即使應用具有許多規則和用戶角色,它仍然是可維護的。
執行
讓我們從 main 函數開始,將所有的東西都配置好,并啟動 http 服務器:
func main() { // setup casbin auth rules authEnforcer, err := casbin.NewEnforcerSafe("./auth_model.conf總結
以上是生活随笔為你收集整理的实现权限控制_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手术步骤_做过 激光手术 恢复视力 的人
- 下一篇: python判断数组中是否存在重复元素_