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())