sys_casbin.go 4.1 KB
Newer Older
1 2 3 4 5 6 7 8
package service

import (
	"errors"
	"gin-vue-admin/global"
	"gin-vue-admin/model"
	"gin-vue-admin/model/request"
	"github.com/casbin/casbin/util"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
9 10 11
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	_ "github.com/go-sql-driver/mysql"
12 13 14 15 16
	"strings"
)

// @title    UpdateCasbin
// @description   update casbin authority, 更新casbin权限
17
// @auth                     (2020/04/05  20:22)
18 19 20
// @param     authorityId      string
// @param     casbinInfos      []CasbinInfo
// @return                     error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
21

22
func UpdateCasbin(authorityId string, casbinInfos []request.CasbinInfo) error {
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
	ClearCasbin(0, authorityId)
	for _, v := range casbinInfos {
		cm := model.CasbinModel{
			ID:          0,
			Ptype:       "p",
			AuthorityId: authorityId,
			Path:        v.Path,
			Method:      v.Method,
		}
		addflag := AddCasbin(cm)
		if addflag == false {
			return errors.New("存在相同api,添加失败,请联系管理员")
		}
	}
	return nil
}

// @title    AddCasbin
// @description   add casbin authority, 添加权限
42 43
// @auth                     (2020/04/05  20:22)
// @param     cm              model.CasbinModel
44
// @return                    bool
Mr.奇淼('s avatar
Mr.奇淼( 已提交
45

46
func AddCasbin(cm model.CasbinModel) bool {
47
	e := Casbin()
Mr.奇淼('s avatar
Mr.奇淼( 已提交
48 49
	success, _ := e.AddPolicy(cm.AuthorityId, cm.Path, cm.Method)
	return success
50 51 52 53
}

// @title    UpdateCasbinApi
// @description   update casbin apis, API更新随动
54
// @auth                     (2020/04/05  20:22)
55 56
// @param     oldPath          string
// @param     newPath          string
57 58
// @param     oldMethod        string
// @param     newMethod        string
59
// @return                     error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
60

61
func UpdateCasbinApi(oldPath string, newPath string, oldMethod string, newMethod string) error {
62
	var cs []model.CasbinModel
63
	err := global.GVA_DB.Table("casbin_rule").Where("v1 = ? AND v2 = ?", oldPath, oldMethod).Find(&cs).Updates(map[string]string{
64 65 66
		"v1": newPath,
		"v2": newMethod,
	}).Error
67 68 69 70 71
	return err
}

// @title    GetPolicyPathByAuthorityId
// @description   get policy path by authorityId, 获取权限列表
72
// @auth                     (2020/04/05  20:22)
73 74
// @param     authorityId     string
// @return                    []string
Mr.奇淼('s avatar
Mr.奇淼( 已提交
75

76
func GetPolicyPathByAuthorityId(authorityId string) (pathMaps []request.CasbinInfo) {
77 78 79
	e := Casbin()
	list := e.GetFilteredPolicy(0, authorityId)
	for _, v := range list {
80 81 82
		pathMaps = append(pathMaps, request.CasbinInfo{
			Path:   v[1],
			Method: v[2],
83
		})
84
	}
85
	return pathMaps
86 87 88 89
}

// @title    ClearCasbin
// @description   清除匹配的权限
90
// @auth                     (2020/04/05  20:22)
91 92 93
// @param     v               int
// @param     p               string
// @return                    bool
Mr.奇淼('s avatar
Mr.奇淼( 已提交
94

95
func ClearCasbin(v int, p ...string) bool {
96
	e := Casbin()
Mr.奇淼('s avatar
Mr.奇淼( 已提交
97 98
	success, _ := e.RemoveFilteredPolicy(v, p...)
	return success
99 100 101 102 103

}

// @title    Casbin
// @description   store to DB, 持久化到数据库  引入自定义规则
104
// @auth                     (2020/04/05  20:22)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
105

106
func Casbin() *casbin.Enforcer {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
107 108 109
	admin := global.GVA_CONFIG.Mysql
	a, _ := gormadapter.NewAdapter(global.GVA_CONFIG.System.DbType, admin.Username+":"+admin.Password+"@("+admin.Path+")/"+admin.Dbname, true)
	e, _ := casbin.NewEnforcer(global.GVA_CONFIG.Casbin.ModelPath, a)
110 111 112 113 114 115 116
	e.AddFunction("ParamsMatch", ParamsMatchFunc)
	_ = e.LoadPolicy()
	return e
}

// @title    ParamsMatch
// @description   customized rule, 自定义规则函数
117
// @auth                     (2020/04/05  20:22)
118 119 120
// @param     fullNameKey1    string
// @param     key2            string
// @return                    bool
Mr.奇淼('s avatar
Mr.奇淼( 已提交
121

122 123
func ParamsMatch(fullNameKey1 string, key2 string) bool {
	key1 := strings.Split(fullNameKey1, "?")[0]
124
	// 剥离路径后再使用casbin的keyMatch2
125 126 127 128 129
	return util.KeyMatch2(key1, key2)
}

// @title    ParamsMatchFunc
// @description   customized function, 自定义规则函数
130
// @auth                     (2020/04/05  20:22)
131 132 133
// @param     args            ...interface{}
// @return                    interface{}
// @return                    error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
134

135 136 137 138
func ParamsMatchFunc(args ...interface{}) (interface{}, error) {
	name1 := args[0].(string)
	name2 := args[1].(string)

139
	return ParamsMatch(name1, name2), nil
140
}