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 权限,有就通过,没有就拒绝。

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

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

查看所有标签

猜你喜欢:

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

Two Scoops of Django

Two Scoops of Django

Daniel Greenfeld、Audrey M. Roy / CreateSpace Independent Publishing Platform / 2013-4-16 / USD 29.95

Two Scoops of Django: Best Practices For Django 1.5 is chock-full of material that will help you with your Django projects. We'll introduce you to various tips, tricks, patterns, code snippets, and......一起来看看 《Two Scoops of Django》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换