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框架中的权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言版本管理module以及go.sum详解

    Go语言版本管理module以及go.sum详解

    本文介绍了Go语言版本管理go module以及go.sum详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Go 并发实现协程同步的多种解决方法

    Go 并发实现协程同步的多种解决方法

    这篇文章主要介绍了Go 并发——实现协程同步的多种解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • Go语言数据结构之单链表的实例详解

    Go语言数据结构之单链表的实例详解

    链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。本文将通过五个例题带大家深入了解Go语言中单链表的用法,感兴趣的可以了解一下
    2022-08-08
  • golang等待触发事件的实例

    golang等待触发事件的实例

    这篇文章主要介绍了golang等待触发事件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GPT回答 go语言和C语言数组操作对比

    GPT回答 go语言和C语言数组操作对比

    这篇文章主要为大家介绍了GPT回答的go语言和C语言数组操作方法对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go使用proto3的踩坑实战记录

    Go使用proto3的踩坑实战记录

    这篇文章主要给大家介绍了关于Go使用proto3的踩坑记录,文中通过实例代码介绍的非常详细,对大家学习或者会用Go语言具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • 深入探究Golang中flag标准库的使用

    深入探究Golang中flag标准库的使用

    在本文中,我们将深入探讨 flag 标准库的实现原理和使用技巧,以帮助读者更好地理解和掌握该库的使用方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-04-04
  • go语言中切片的长度和容量的区别

    go语言中切片的长度和容量的区别

    这篇文章主要介绍了go语言中切片的长度和容量的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 如何用Go判断元素是否在切片中

    如何用Go判断元素是否在切片中

    切片(Slice)是一个拥有相同类型元素的可变长度的序列,下面这篇文章主要给大家介绍了关于如何用Go判断元素是否在切片中的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Go 函数选项模式

    Go 函数选项模式

    在 Go 语言中,函数选项模式(Functional Options Pattern) 是一种优雅的设计模式,用于处理可选配置参数,特别是当配置项较多或可能变化时,它避免了冗长的构造函数参数列表,提高了代码的可读性和可扩展性,本文介绍Go函数选项模式,感兴趣的朋友一起看看吧
    2025-08-08

最新评论