Go语言中的访问权限控制
在 go 中进行权限管理时,推荐使用 grouper、casbin 和 sentry 框架。grouper 适合基于角色的访问控制,casbin 提供高级 rbac 功能,而 sentry 提供云托管权限服务和丰富的功能集,包括多因素认证和活动审核。这些框架有助于在电子商务网站等实际场景中实施细粒度的访问控制,例如为用户授予对特定产品类别的访问权限。
Go框架中的权限管理
权限管理对于保护敏感数据和实现细粒度的访问控制至关重要。在 Go 中,有几个框架可以简化权限管理任务:
1. Grouper
Grouper 是一个基于角色的访问控制(RBAC)框架,它允许您轻松创建角色和分配权限。
import ( "github.com/grouper/grouper" ) func main() { // 创建一个角色 role := grouper.NewRole("admin") // 添加权限 role.Allow("read", "data") role.Allow("write", "data") // 创建一个用户 user := grouper.NewUser("john") // 分配角色 user.AddRole(role) // 检查用户是否有访问权限 if user.HasPermission("read", "data") { // 授予访问权限 } else { // 拒绝访问权限 } }
2. Casbin
Casbin 是另一个流行的 RBAC 框架,具有丰富的功能集,包括多继承和条件权限。
import ( "github.com/casbin/casbin" ) func main() { // 创建一个执行器 enforcer := casbin.NewEnforcer("model.conf", "policy.csv") // 检查用户是否有访问权限 if enforcer.Enforce("john", "data", "read") { // 授予访问权限 } else { // 拒绝访问权限 } }
3. Sentry
Sentry 是一个云托管权限服务,提供高级权限管理功能,例如多因素身份验证和活动审计。
import ( "github.com/getsentry/sentry-go" ) func main() { // 连接到 Sentry _ = sentry.Init(sentry.ClientOptions{}) // 向 Sentry 事件添加用户上下文 sentry.CaptureEvent(&sentry.Event{ User: &sentry.User{ ID: "john", Username: "john@example.com", }, }) }
案例:Casbin实现RBAC和功能权限
1.安装
go get github.com/casbin/casbin/v2
2.编写brace_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
Model语法
Model CONF 至少应包含四个部分: [request_definition], [policy_definition], [policy_effect], [matchers]。
如果 model 使用 RBAC, 还需要添加[role_definition]部分。
Model CONF 文件可以包含注释。注释以 # 开头, # 会注释该行剩余部分。
sub, obj, act 表示经典三元组: 访问实体 (Subject),访问资源 (Object) 和访问方法 (Action)。 但是, 你可以自定义你自己的请求表单, 如果不需要指定特定资源,则可以这样定义 sub、act ,或者如果有两个访问实体, 则为 sub、sub2、obj、act。可以把sub当作用户角色, obj为资源对象(比如api路径), act当作请求行为方法(比如get 和 post等)
3.连接mysql
adapter := xormadapter.NewAdapter("mysql", "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4", true) enforcer := casbin.NewEnforcer("./rbac_models.conf", adapter) err := enforcer.LoadPolicy() if err != nil { logger.RLog.Error("enforcer load policy err", zap.Error(err)) }
4.添加权限
if ok := enforcer.AddPolicy(roleName, url, method); !ok { log.Fatal("添加权限失败") } else { log.Fatal("添加权限成功") }
5.删除权限
if ok := enforcer.RemovePolicy(roleName, url, method); !ok { log.Fatal("删除权限失败") } else { log.Fatal("删除权限成功") }
6.中间件校验权限
func CheckPermission() echo.MiddlewareFunc { return func(handlerFunc echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { obj := c.Request().URL.RequestURI() act := c.Request().Method sub := "admin" if ok := _casbin.Enforcer.Enforce(sub, obj, act); !ok { return c.JSON(http.StatusOK, _auth.PermissionInterception) } return handlerFunc(c) } } }
7.路由引入中间件
总结
到此这篇关于Go语言中的访问权限控制的文章就介绍到这了,更多相关Go框架中的权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例
时间和日期是我们编程中经常会用到的,下面这篇文章主要给大家介绍了关于golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例,需要的朋友可以参考下2022-08-08
最新评论