Go语言中的访问权限控制

 更新时间:2024年08月10日 11:20:50   作者:WBOY  
在 go 中进行权限管理时,推荐使用 grouper、casbin 和 sentry 框架,grouper 适合基于角色的访问控制,casbin 提供高级 rbac 功能,而 sentry 提供云托管权限服务和丰富的功能集,包括多因素认证和活动审核,这些框架有助于在电子商务网站等实际场景中实施细粒度的访问控制

在 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语言HTTP客户端实践

    详解Golang语言HTTP客户端实践

    本文主要介绍了Golang语言HTTP客户端实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例

    golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例

    时间和日期是我们编程中经常会用到的,下面这篇文章主要给大家介绍了关于golang中time包之时间间隔格式化和秒、毫秒、纳秒等时间戳格式输出的方法实例,需要的朋友可以参考下
    2022-08-08
  • golang http 连接超时和传输超时的例子

    golang http 连接超时和传输超时的例子

    今天小编就为大家分享一篇golang http 连接超时和传输超时的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Golang 之区分类型别名与类型定义的方法

    Golang 之区分类型别名与类型定义的方法

    这篇文章主要介绍了Golang 之区分类型别名与类型定义的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Go panic的三种产生方式细节探究

    Go panic的三种产生方式细节探究

    这篇文章主要介绍了Go panic的三种产生方式细节探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go语言sync.Cond基本使用及原理示例详解

    Go语言sync.Cond基本使用及原理示例详解

    这篇文章主要为大家介绍了Go语言sync.Cond基本使用及原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Go基础教程系列之WaitGroup用法实例详解

    Go基础教程系列之WaitGroup用法实例详解

    这篇文章主要介绍了Go基础教程系列之WaitGroup用法实例详解,需要的朋友可以参考下
    2022-04-04
  • Golang通脉之类型定义

    Golang通脉之类型定义

    这篇文章主要介绍了Golang通脉之类型定义,在Go语言中有一些基本的数据类型,如 string 、 整型 、 浮点型 、 布尔 等数据类型, Go语言中可以使用 type 关键字来定义自定义类型,下面和小编一起进入文章看具体内容吧
    2021-10-10
  • 使用Go语言实现Yaml编码和解码的方法详解

    使用Go语言实现Yaml编码和解码的方法详解

    在这篇文章中,我们将介绍如何使用Go语言编写代码来实现Yaml编码和解码,文中有详细的代码示例供大家参考,对大家的学习和工作有一定的帮助,需要的朋友可以参考下
    2023-11-11
  • Golang实现自定义时间结构体并支持Json&Gorm

    Golang实现自定义时间结构体并支持Json&Gorm

    因为时区等问题,很多项目需要自定义时区和时间格式,所以这篇文章主要为大家介绍了Golang如何实现自定义时间结构体并支持Json&Gorm,希望对大家有所帮助
    2024-03-03

最新评论