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, 而是启动的时候 先初始化, 然后通过数据库里面的 对应关系 ,动态加载所有的 权限条目 然后通过中间件去判断,如果有更新,可以动态修改更新 权限条目.
例子
目录
代码
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 权限,有就通过,没有就拒绝。 测试 可以把 用户名 写成其他的, 再重启启动,此时,中间件判断 不通过,就会返回 拒绝。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
图解CIO工作指南(第4版)
[日] 野村综合研究所系统咨询事业本部 / 周自恒 / 人民邮电出版社 / 2014-3 / 39.00
《图解CIO工作指南(第4版)》是一本实务手册,系统介绍了企业运用IT手段提高竞争力所必需的管理方法和实践经验,主要面向CEO或CIO等企业管理人士。 《图解CIO工作指南(第4版)》分为三个部分。第1部分的主题为IT管理,着重阐述运用IT技术提高企业竞争力所必需的所有管理业务,具体包括制定作为企业方针的IT战略,以及统筹执行该战略时与IT相关的人力、物力、财力、风险等要素在内的一系列管理业......一起来看看 《图解CIO工作指南(第4版)》 这本书的介绍吧!