日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

实现权限控制_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制

發(fā)布時(shí)間:2025/3/21 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现权限控制_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Go語言中文網(wǎng),致力于每日分享編碼、開源等知識,歡迎關(guān)注我,會(huì)有意想不到的收獲!

身份認(rèn)證和授權(quán)對 web 應(yīng)用的安全至關(guān)重要。最近,我用 Go 完成了我的第一個(gè)正式的 web 應(yīng)用,這篇文章是在這個(gè)過程中我所學(xué)到的部分內(nèi)容。

本文中,我們的關(guān)注點(diǎn)在于如何在 web 應(yīng)用中使用開源的 casbin 庫進(jìn)行 HTTP 權(quán)限控制。同時(shí),在示例代碼中我們使用了 scs 庫進(jìn)行 session 管理。

下面的例子十分基礎(chǔ),希望它盡可能的展示了如何在 Go web 應(yīng)用中實(shí)現(xiàn)權(quán)限控制。為了更側(cè)重于展示 casbin 的使用,我們盡量簡化業(yè)務(wù)邏輯(例如:不需密碼的登陸操作)。我們一起來看一下!

注意:請不要在生產(chǎn)環(huán)境中使用所示的用例代碼,該例子側(cè)重于描述清晰,而不是安全性。

建立

首先,我們創(chuàng)建一個(gè) User 模型,并實(shí)現(xiàn)了相應(yīng)方法:

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 所需文件。這里我們需要一個(gè)配置文件和一個(gè)策略文件。配置文件使用 PERM 元模型。PERM 表示策略(Policy)、效果(Effect)、請求(Request)和匹配器(Matchers)。

在 auth_model.conf 配置文件中有如下內(nèi)容:

[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 == "*")

其中定義了請求和策略來表示主體,客體和動(dòng)作。在本例中,主體表示用戶角色,客體表示訪問路徑,action 表示請求方法(例:GET, POST 等)。

匹配器定義了策略是如何匹配的,可以通過直接定義主體,或者使用像 keyMatch 這樣的幫助方法,它也可以匹配通配符。casbin 實(shí)際比這個(gè)簡單的例子要強(qiáng)大得多,你可以用聲明的方式定義各種自定義功能來達(dá)到輕松切換和維護(hù)鑒權(quán)配置的效果。

在安全性方面,我通常會(huì)選擇最簡單的解決方案,因?yàn)楫?dāng)系統(tǒng)開始變復(fù)雜和難以維護(hù)時(shí),錯(cuò)誤就開始發(fā)生。

在這個(gè)例子中,策略文件就是一個(gè)簡單的 csv 文件,描述了哪些角色可以訪問哪些路徑等。

policy.csv 文件格式如下:

p, admin, /*, *p, anonymous, /login, *p, member, /logout, *p, member, /member/*, *

這個(gè)配置文件十分簡單。在這個(gè)例子中,我們簡單的定義了 admin 角色可以訪問所有內(nèi)容,member 角色可以訪問以 /member/ 開頭的路徑和 logout 路徑,未認(rèn)證用戶可以登陸。

這種形式的好處在于即使應(yīng)用具有許多規(guī)則和用戶角色,它仍然是可維護(hù)的。

執(zhí)行

讓我們從 main 函數(shù)開始,將所有的東西都配置好,并啟動(dòng) http 服務(wù)器:

func main() { // setup casbin auth rules authEnforcer, err := casbin.NewEnforcerSafe("./auth_model.conf

總結(jié)

以上是生活随笔為你收集整理的实现权限控制_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。