基于gin-vue-admin模板 面向对象权限设计示例

模板基于 gin-vue-admin

主要修改 sys_apis表,新增一个 判断权限的字段 v3 例如: {"name":"123"}

核心还是基于casbin基础上,进行扩展。

中间件

在需要的模块上面 加上这个中间件验证。

关于find update delete 还是需要根据不同的板块进行单独的设置。主要是选择数据库上面。

func CasbinHandlerObject() gin.HandlerFunc {
    return func(c *gin.Context) {
        obj := c.Request.URL.RequestURI()
        act := c.Request.Method
        db := global.GVA_DB.Model(&model.ExaCustomer{})
        obj1 := strings.Split(obj, "?")
        var a model.SysApi
        _ = db.Where(" path = (?)", obj1[0]).Where(" method =  (?)", act).First(&a).Error

        url := strings.Split(obj, "/")
        if url[2][:3] == "cre" {
            type str1 map[string]string
            data1 := str1{}
            if a.V3 == "" { //  权限条件
                // 代表没有权限限制
                c.Next()
            } else {
                if err := json.Unmarshal([]byte(a.V3), &data1); err != nil {
                    response.Result(response.ERROR, gin.H{}, "权限设置错误", c)
                    c.Abort()
                    return
                }
                for k, v := range data1 {
                    body := c.Request.Body
                    dataByte, _ := ioutil.ReadAll(body)
                    fSion := gofasion.NewFasion(string(dataByte))
                    name := fSion.Get(k).ValueStr()
                    c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(dataByte))
                    if name == v {
                        c.Next()
                        return
                    }
                }
                response.Result(response.ERROR, gin.H{}, "权限不足", c)
                c.Abort()
                return
            }

        }
        if url[2][:3] == "get" {
            type str1 map[string]string
            data1 := str1{}
            if a.V3 == "" { //  权限条件
                // 代表没有权限限制
                c.Next()
            } else {
                if err := json.Unmarshal([]byte(a.V3), &data1); err != nil {
                    response.Result(response.ERROR, gin.H{}, "权限设置错误", c)
                    c.Abort()
                    return
                }
                data := c.Request.URL.RawQuery // page=1&pageSize=10
                re := ""
                for k, v := range data1 {
                    re = "&" + k + "=" + v
                }
                c.Request.URL.RawQuery = data + re //
                c.Next()

            }
        }

        if url[2][:3] == "upd" { // find delete 和这个类似 ,都是通过get或者post 先获取到id
            id := 36 // com.StrTo(c.Query("id")).MustInt(),  com.StrTo(c.Param("id")).MustInt()
            type str1 map[string]string
            data1 := str1{}
            if a.V3 == "" { //  权限条件
                // 代表没有权限限制
                c.Next()
            } else {
                if err := json.Unmarshal([]byte(a.V3), &data1); err != nil {
                    response.Result(response.ERROR, gin.H{}, "权限设置错误", c)
                    c.Abort()
                    return
                }
                var a model.Dep
                type depStruct struct {
                    name string
                }
                dep1 := depStruct{}
                for k, v := range data1 {
                    if k == "name" {
                        dep1.name = v
                    }
                }
                err := db.Where("id = ?", id).Where(dep1).First(&a).Error  // 可以根据  a.api_group 进行选择不同的数据库
                if err != nil {
                    response.Result(response.ERROR, gin.H{}, "更新权限不足", c)
                    c.Abort()
                    return
                }
                c.Next()
            }
        }
        c.Next()
    }
}