go gin+casbin RBAC 简单例子

栏目: Go · 发布时间: 6年前

go gin+casbin RBAC 简单例子

说明

利用的库:
github.com/casbin/casbin
github.com/gin-gonic/gin
github.com/facebookgo/inject
本文为 参考此项目: https://github.com/LyricTian/gin-admin ,强烈推荐!!!

casbin文档: https://casbin.org/zh-CN/

下面例子 未利用 casbin 的 adapter, 而是启动的时候 先初始化,
然后通过数据库里面的 对应关系 ,动态加载所有的 权限条目

然后通过中间件去判断,如果有更新,可以动态修改更新 权限条目.

例子

目录

go gin+casbin RBAC 简单例子

代码

rbac_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) == true \
    && keyMatch2(r.obj, p.obj) == true \
    && regexMatch(r.act, p.act) == true
b_auth.go 

package bll

//gin-allin/models  为自己的项目  请忽略
import (
   "gin-allin/models"
   "github.com/casbin/casbin"
)

//models.Auth  为 User表     实际可以写成自己的USER 表  
type Role struct {
   Role      *models.Auth     `inject:""`
   Enforcer  *casbin.Enforcer `inject:""`
}

// LoadPolicy 加载角色权限策略,
func (a *Role) LoadPolicy(roleID string) error {
   a.Enforcer.AddPolicy(roleID, "/api/v1/auth_info","GET")
   return nil
}
b_common.go

package bll

//把 权限表  注入到 Common
type Common struct {
   Role   *Role    `inject:""`
}

inject.go
package inject

import (
   "gin-allin/bll"
   "github.com/casbin/casbin"
   "github.com/facebookgo/inject"
   "os"
)

// Object 注入对象  
type Object struct {
   Common     *bll.Common
   Enforcer   *casbin.Enforcer
}

// Init 初始化依赖注入
func Init() *Object {
   g := new(inject.Graph)

   // 注入casbin    
   dir, _ := os.Getwd()
   path := dir + "\\src\\gin-allin\\conf\\rbac_model.conf"
   enforcer := casbin.NewEnforcer(path, false)
   _ = g.Provide(&inject.Object{Value: enforcer})

   //  注入Common  也就是 Role
   Common := new(bll.Common)
   _ = g.Provide(&inject.Object{Value: Common})

   if err := g.Populate(); err != nil {
      panic("初始化依赖注入发生错误:" + err.Error())
   }

   // 返回 注入完的对象 
   return &Object{
      Enforcer:  enforcer,
      Common :Common,
   }
}
casb.go

package casb

import (
   "gin-allin/inject"
   "github.com/gin-gonic/gin"
   "net/http"
)

// 权限判断   
func CasbinMiddleware(obj *inject.Object) gin.HandlerFunc {
   return func(c *gin.Context) {

      // 判断   权限 是否为 true
      if b, err := obj.Enforcer.EnforceSafe("hequan", c.Request.URL.Path, c.Request.Method); err != nil {
         c.JSON(http.StatusUnauthorized, gin.H{
            "code": "权限 判断错误",
            "msg":  "权限 判断错误",
            "data": "权限 判断错误",
         })
         c.Abort()
         return
      } else if !b {

         c.JSON(http.StatusUnauthorized, gin.H{
            "code": "没有权限",
            "msg":  "没有权限",
            "data": "没有权限",
         })
         c.Abort()
         return
      }
      c.Next()
   }
}
router.go

package routers

func InitRouter() *gin.Engine {
   // 生成对象
   obj := inject.Init()

   err := loadCasbinPolicyData(obj)

   if err != nil {
      panic("加载casbin策略数据发生错误:" + err.Error())
   }

   apiv1.Use(casb.CasbinMiddleware(obj))
}

// 加载casbin策略数据   加载 hequan  的一个权限
func loadCasbinPolicyData(obj *inject.Object) error {
   err := obj.Common.Role.LoadPolicy("hequan")
   if err != nil {
      fmt.Println(err)
      return err
   }
   return nil
}

结果

当 用户  hequan  去 访问   /api/v1/auth_info 时,会去判断是否有GET 权限,有就通过,没有就拒绝。

测试 可以把  用户名 写成其他的, 再重启启动,此时,中间件判断 不通过,就会返回 拒绝。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高性能JavaScript

高性能JavaScript

Nicholas C.Zakas / 丁琛、赵泽欣 / 电子工业出版社 / 2010-11 / 49.00元

如果你使用JavaScript构建交互丰富的Web应用,那么JavaScript代码可能是造成你的Web应用速度变慢的主要原因。《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM交互、页面生存周期等。雅虎的前端工程师Nicholas C. Zakas和其他五位JavaScript专家介绍了页面代码加载的最佳方......一起来看看 《高性能JavaScript》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码