sys_casbin.go 3.8 KB
Newer Older
1
package system
2 3 4 5

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

m0_50812349's avatar
m0_50812349 已提交
16 17 18 19 20
//@author: [piexlmax](https://github.com/piexlmax)
//@function: UpdateCasbin
//@description: 更新casbin权限
//@param: authorityId string, casbinInfos []request.CasbinInfo
//@return: error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
21

22 23 24 25 26 27 28
type CasbinService struct {
}

var CasbinServiceApp = new(CasbinService)

func (casbinService *CasbinService) UpdateCasbin(authorityId string, casbinInfos []request.CasbinInfo) error {
	casbinService.ClearCasbin(0, authorityId)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
29
	rules := [][]string{}
30
	for _, v := range casbinInfos {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
31
		cm := system.CasbinModel{
32 33 34 35 36
			Ptype:       "p",
			AuthorityId: authorityId,
			Path:        v.Path,
			Method:      v.Method,
		}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
37
		rules = append(rules, []string{cm.AuthorityId, cm.Path, cm.Method})
38
	}
39
	e := casbinService.Casbin()
Mr.奇淼('s avatar
Mr.奇淼( 已提交
40 41 42 43 44
	success, _ := e.AddPolicies(rules)
	if success == false {
		return errors.New("存在相同api,添加失败,请联系管理员")
	}
	return nil
45 46
}

m0_50812349's avatar
m0_50812349 已提交
47 48 49 50 51
//@author: [piexlmax](https://github.com/piexlmax)
//@function: UpdateCasbinApi
//@description: API更新随动
//@param: oldPath string, newPath string, oldMethod string, newMethod string
//@return: error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
52

53
func (casbinService *CasbinService) UpdateCasbinApi(oldPath string, newPath string, oldMethod string, newMethod string) error {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
54
	err := global.GVA_DB.Table("casbin_rule").Model(&system.CasbinModel{}).Where("v1 = ? AND v2 = ?", oldPath, oldMethod).Updates(map[string]interface{}{
55 56 57
		"v1": newPath,
		"v2": newMethod,
	}).Error
58 59 60
	return err
}

m0_50812349's avatar
m0_50812349 已提交
61 62 63 64 65 66
//@author: [piexlmax](https://github.com/piexlmax)
//@function: GetPolicyPathByAuthorityId
//@description: 获取权限列表
//@param: authorityId string
//@return: pathMaps []request.CasbinInfo

67 68
func (casbinService *CasbinService) GetPolicyPathByAuthorityId(authorityId string) (pathMaps []request.CasbinInfo) {
	e := casbinService.Casbin()
69 70
	list := e.GetFilteredPolicy(0, authorityId)
	for _, v := range list {
71 72 73
		pathMaps = append(pathMaps, request.CasbinInfo{
			Path:   v[1],
			Method: v[2],
74
		})
75
	}
76
	return pathMaps
77 78
}

m0_50812349's avatar
m0_50812349 已提交
79 80 81 82 83
//@author: [piexlmax](https://github.com/piexlmax)
//@function: ClearCasbin
//@description: 清除匹配的权限
//@param: v int, p ...string
//@return: bool
Mr.奇淼('s avatar
Mr.奇淼( 已提交
84

85 86
func (casbinService *CasbinService) ClearCasbin(v int, p ...string) bool {
	e := casbinService.Casbin()
Mr.奇淼('s avatar
Mr.奇淼( 已提交
87 88
	success, _ := e.RemoveFilteredPolicy(v, p...)
	return success
89 90 91

}

m0_50812349's avatar
m0_50812349 已提交
92 93 94 95
//@author: [piexlmax](https://github.com/piexlmax)
//@function: Casbin
//@description: 持久化到数据库  引入自定义规则
//@return: *casbin.Enforcer
Mr.奇淼('s avatar
Mr.奇淼( 已提交
96

97 98 99 100 101
var (
	syncedEnforcer *casbin.SyncedEnforcer
	once           sync.Once
)

102
func (casbinService *CasbinService) Casbin() *casbin.SyncedEnforcer {
103 104 105
	once.Do(func() {
		a, _ := gormadapter.NewAdapterByDB(global.GVA_DB)
		syncedEnforcer, _ = casbin.NewSyncedEnforcer(global.GVA_CONFIG.Casbin.ModelPath, a)
106
		syncedEnforcer.AddFunction("ParamsMatch", casbinService.ParamsMatchFunc)
107 108 109
	})
	_ = syncedEnforcer.LoadPolicy()
	return syncedEnforcer
110 111
}

m0_50812349's avatar
m0_50812349 已提交
112 113 114 115 116
//@author: [piexlmax](https://github.com/piexlmax)
//@function: ParamsMatch
//@description: 自定义规则函数
//@param: fullNameKey1 string, key2 string
//@return: bool
Mr.奇淼('s avatar
Mr.奇淼( 已提交
117

118
func (casbinService *CasbinService) ParamsMatch(fullNameKey1 string, key2 string) bool {
119
	key1 := strings.Split(fullNameKey1, "?")[0]
120
	// 剥离路径后再使用casbin的keyMatch2
121 122 123
	return util.KeyMatch2(key1, key2)
}

m0_50812349's avatar
m0_50812349 已提交
124 125 126 127 128
//@author: [piexlmax](https://github.com/piexlmax)
//@function: ParamsMatchFunc
//@description: 自定义规则函数
//@param: args ...interface{}
//@return: interface{}, error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
129

130
func (casbinService *CasbinService) ParamsMatchFunc(args ...interface{}) (interface{}, error) {
131 132 133
	name1 := args[0].(string)
	name2 := args[1].(string)

134
	return casbinService.ParamsMatch(name1, name2), nil
135
}