• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang之casbin权限管理的实现

    1. 权限管理

    Casbin是用于Golang项目的功能强大且高效的开源访问控制库。

    1.1.1. 特征

    Casbin的作用:

    以经典{subject, object, action}形式或您定义的自定义形式实施策略,同时支持允许和拒绝授权。
    处理访问控制模型及其策略的存储。
    管理角色用户映射和角色角色映射(RBAC中的角色层次结构)。
    支持内置的超级用户,例如root或administrator。超级用户可以在没有显式权限的情况下执行任何操作。
    多个内置运算符支持规则匹配。例如,keyMatch可以将资源键映射/foo/bar到模式/foo*。

    Casbin不执行的操作:

    身份验证(又名验证username以及password用户登录时)
    管理用户或角色列表。我相信项目本身管理这些实体会更方便。用户通常具有其密码,而Casbin并非设计为密码容器。但是,Casbin存储RBAC方案的用户角色映射。

    1.1.2. 怎么运行的

    在Casbin中,基于PERM元模型(策略,效果,请求,匹配器)将访问控制模型抽象为CONF文件。因此,切换或升级项目的授权机制就像修改配置一样简单。您可以通过组合可用的模型来定制自己的访问控制模型。例如,您可以在一个模型中同时获得RBAC角色和ABAC属性,并共享一组策略规则。

    Casbin中最基本,最简单的模型是ACL。ACL的CONF模型为:

    #请求定义
    [request_definition] 
    r = sub,obj,act
    
    #策略定义
    [policy_definition] 
    p = sub,obj,act
    
    #政策效果
    [policy_effect] 
    e = some(其中( p.eft ==允许))
    
    #匹配器
    [匹配器] 
    米 = r.sub == p.sub  r.obj == p.obj  r.act == p.act
    
    ACL模型的示例策略如下:
    
    p, alice, data1, read
    p, bob, data2, write

    1.1.3. 安装

    go get github.com/casbin/casbin

    1.1.4. 示例代码

    package main
    
    import (
      "fmt"
      "log"
    
      "github.com/casbin/casbin"
      xormadapter "github.com/casbin/xorm-adapter"
      "github.com/gin-gonic/gin"
      _ "github.com/go-sql-driver/mysql"
    )
    
    func main() {
      // 要使用自己定义的数据库rbac_db,最后的true很重要.默认为false,使用缺省的数据库名casbin,不存在则创建
      a, err := xormadapter.NewAdapter("mysql", "root:root@tcp(127.0.0.1:3306)/goblog?charset=utf8", true)
      if err != nil {
        log.Printf("连接数据库错误: %v", err)
        return
      }
      e, err := casbin.NewEnforcer("./rbac_models.conf", a)
      if err != nil {
        log.Printf("初始化casbin错误: %v", err)
        return
      }
      //从DB加载策略
      e.LoadPolicy()
    
      //获取router路由对象
      r := gin.New()
    
      r.POST("/api/v1/add", func(c *gin.Context) {
        fmt.Println("增加Policy")
        if ok, _ := e.AddPolicy("admin", "/api/v1/hello", "GET"); !ok {
          fmt.Println("Policy已经存在")
        } else {
          fmt.Println("增加成功")
        }
      })
      //删除policy
      r.DELETE("/api/v1/delete", func(c *gin.Context) {
        fmt.Println("删除Policy")
        if ok, _ := e.RemovePolicy("admin", "/api/v1/hello", "GET"); !ok {
          fmt.Println("Policy不存在")
        } else {
          fmt.Println("删除成功")
        }
      })
      //获取policy
      r.GET("/api/v1/get", func(c *gin.Context) {
        fmt.Println("查看policy")
        list := e.GetPolicy()
        for _, vlist := range list {
          for _, v := range vlist {
            fmt.Printf("value: %s, ", v)
          }
        }
      })
      //使用自定义拦截器中间件
      r.Use(Authorize(e))
      //创建请求
      r.GET("/api/v1/hello", func(c *gin.Context) {
        fmt.Println("Hello 接收到GET请求..")
      })
    
      r.Run(":9000") //参数为空 默认监听8080端口
    }
    
    //拦截器
    func Authorize(e *casbin.Enforcer) gin.HandlerFunc {
    
      return func(c *gin.Context) {
    
        //获取请求的URI
        obj := c.Request.URL.RequestURI()
        //获取请求方法
        act := c.Request.Method
        //获取用户的角色
        sub := "admin"
    
        //判断策略中是否存在
        if ok, _ := e.Enforce(sub, obj, act); ok {
          fmt.Println("恭喜您,权限验证通过")
          c.Next()
        } else {
          fmt.Println("很遗憾,权限验证没有通过")
          c.Abort()
        }
      }
    }

    rbac_models.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

    配置链接数据库不需要手动创建数据库,系统自动创建casbin_rule表

    使用postman请求http://localhost:9000/api/v1/hello

    运行解决结果显示为很遗憾,权限验证没有通过

    下面我在数据表中添加数据在演示的时候可以直接手动按照图片的格式直接添加数据表,或者使用postman POST方式请求http://localhost:9000/api/v1/add

    然后继续请求http://localhost:9000/api/v1/hello

    原文地址:
    http://www.topgoer.com/gin框架/其他/权限管理.html

    到此这篇关于Golang之casbin权限管理的实现的文章就介绍到这了,更多相关Golang casbin权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • go语言使用Casbin实现角色的权限控制
    上一篇:Golang 定时器(Timer 和 Ticker),这篇文章就够了
    下一篇:golang之数据验证validator的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Golang之casbin权限管理的实现 Golang,之,casbin,权限,管理,