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())
相关文章
|
6月前
|
JSON Go API
GO 权限管理之 Casbin
GO 权限管理之 Casbin
|
7月前
|
JSON 安全 Linux
Go 语言学习之 go tool
Go 语言学习之 go tool
59 0
|
5月前
|
JSON Go 数据格式
go 学习
go 学习
45 2
|
11月前
|
存储 缓存 监控
Go源码之netpoll.go文件详解
Go源码之netpoll.go文件详解
169 0
|
11月前
|
NoSQL 关系型数据库 MySQL
学习golang(9) 初探:go path与go mod
学习golang(9) 初探:go path与go mod
147 1
|
12月前
|
Prometheus 监控 Cloud Native
Go:Promethus Eexporter开发,一篇带你玩妥它。
Go:Promethus Eexporter开发,一篇带你玩妥它。
|
JSON 缓存 Prometheus
工作用Go: GORM篇
工作用Go: GORM篇
503 0
|
Go C++ Python
【Go学习笔记】通过go-by-example学Go(二)
string string的常用函数,其中的Replace()表达给我印象比较深刻,n为-1表示全部替换 strconv Atoi()在这里指的不是ASCII对应字符转int,而是字符串转int
79 0
|
Java 编译器 Go
【Go学习笔记】(一)通过go-by-example学Go
前言 从今天开始,打算正式入坑Go,并计划以一周为周期,初步熟悉Go语言特性、基础语法等。吸取了前面学习的教训,这次打算通过阅读分析现成代码、主动思考和探索来学习。
88 0