go-casbin

简介: go-casbin

go-casbin

简介

casbin 是一个开源访问框架,主要是由 两部分组成,model、policy 组成。policy 支持多种形式,如文件、数据库。model 为配置文件。

安装

go get github.com/casbin/casbin/v2
go mod tidy
go mod vendor

角色 rbac model 示例

rbac_model.conf

[request_definition]
r = sub, dom, obj, act

[policy_definition]
p = sub, dom, obj, act

[role_definition]
g = _, _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act || r.sub == "admin"

使用 mysql 作为 policy 存储示例

func InitCasbin(){
   
  // db 为数据库实例 CasbinRuleModel 为创建的表名称
    a, _ := gormadapter.NewAdapterByDBWithCustomTable(db.DB, &cb.CasbinRuleModel{
   }, "CasbinRuleModel")
  // 添加 model文件
    RB, _ = casbin.NewEnforcer("./internal/pkg/config/rbac_model.conf", a)
  // 将规则加载到内存中
    RB.LoadPolicy()
}

gin 中间件示例

func CasbinHandler() gin.HandlerFunc {
   
    return func(ctx *gin.Context) {
   
        response := app.NewResponse(ctx)
        // 获取请求的参数
        //user := ctx.Request.Header.Get("username")
        user, _ := ctx.Get("username")
        proj := ctx.Query("project")
        obj := ctx.Query("env") + "-" +ctx.Query("object")
        act := ctx.Query("action")
        fmt.Println("111")
        fmt.Println(user, proj, obj, act)
        // 判断策略中是否存在
        success, _ := common.RB.Enforce(user, proj, obj, act)
        if success {
   
            logger.LogInstance.Info("权限验证通过")
            ctx.Next()
        } else {
   
            logger.LogInstance.Error("e.Enforce err: %s", "权限验证没有通过")
            response.ToErrorResponse(errcode.UnauthorizedAuthFail)
            ctx.Abort()
            return
        }
    }
}

router 使用示例

    demo1 := e.Group("/demo1")
    demo1.Use(middleware.JWTAuthMiddleware())
    demo1.Use(handler.CasbinHandler())
相关文章
|
JSON Go API
GO 权限管理之 Casbin
GO 权限管理之 Casbin
222 0
|
5月前
|
Go
Go to Learn Go之错误处理
Go to Learn Go之错误处理
61 7
|
6月前
|
算法 搜索推荐 Unix
快速指南: Go 1.19功能
快速指南: Go 1.19功能
|
安全 Java 编译器
Go到底能不能实现安全的双检锁?1
Go到底能不能实现安全的双检锁?1
111 0
|
Prometheus 监控 Cloud Native
Go:Promethus Eexporter开发,一篇带你玩妥它。
Go:Promethus Eexporter开发,一篇带你玩妥它。
|
Go 数据库
Go 编程 | 连载 25 - Go 的 defer 语句
Go 编程 | 连载 25 - Go 的 defer 语句
Go 编程 | 连载 25 - Go 的 defer 语句
|
Go Python
Go 语言快速入门指南:Go 函数
函数是一段代码的片段,包含连续的执行语句,它可以将零个或多个输入参数映射到零个或多个参数输出。函数像一个黑盒,对它的使用者隐藏实现细节。还可以在代码中通过函数调用来执行它们。
Go 语言快速入门指南:Go 函数
|
边缘计算 BI Go
Go-Excelize API源码阅读(二)——OpenFile()
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。
181 1
|
Java 编译器 Go
【Go学习笔记】(一)通过go-by-example学Go
前言 从今天开始,打算正式入坑Go,并计划以一周为周期,初步熟悉Go语言特性、基础语法等。吸取了前面学习的教训,这次打算通过阅读分析现成代码、主动思考和探索来学习。
131 0
|
Go C++ Python
【Go学习笔记】通过go-by-example学Go(二)
string string的常用函数,其中的Replace()表达给我印象比较深刻,n为-1表示全部替换 strconv Atoi()在这里指的不是ASCII对应字符转int,而是字符串转int
114 0