-
Notifications
You must be signed in to change notification settings - Fork 66
/
index.go
82 lines (70 loc) · 2.05 KB
/
index.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package casbin
import (
"github.com/aaronchen2k/deeptest/internal/pkg/consts"
"github.com/aaronchen2k/deeptest/internal/server/core/dao"
logUtils "github.com/aaronchen2k/deeptest/pkg/lib/log"
"path/filepath"
"strconv"
"sync"
"github.com/casbin/casbin/v2"
gormadapter "github.com/casbin/gorm-adapter/v3"
"go.uber.org/zap"
)
var (
once sync.Once
enforcer *casbin.Enforcer
store sync.Map
)
// Instance casbin 单例
func Instance(tenantId consts.TenantId) *casbin.Enforcer {
res, ok := store.Load(tenantId)
if !ok {
res, _ = store.LoadOrStore(tenantId, GetEnforcer(tenantId))
}
/*
once.Do(func() {
enforcer = GetEnforcer()
})
*/
return res.(*casbin.Enforcer)
}
// GetEnforcer 获取 casbin.Enforcer
func GetEnforcer(tenantId consts.TenantId) *casbin.Enforcer {
if dao.GetDB(tenantId) == nil {
logUtils.Errorf("数据库未初始化")
return nil
}
c, err := gormadapter.NewAdapterByDBUseTableName(dao.GetDB(tenantId), "", "sys_casbin_rule") // Your driver and data source.
if err != nil {
logUtils.Errorf("驱动初始化错误", zap.String("gormadapter.NewAdapterByDBUseTableName()", err.Error()))
return nil
}
pth := filepath.Join(consts.WorkDir, consts.CasbinFileName) // created if needed in config init method
enforcer, err := casbin.NewEnforcer(pth, c)
if err != nil {
logUtils.Errorf("初始化失败", zap.String("casbin.NewEnforcer()", err.Error()))
return nil
}
if enforcer == nil {
logUtils.Errorf("Casbin 未初始化")
return nil
}
err = enforcer.LoadPolicy()
if err != nil {
logUtils.Errorf("加载规则失败", zap.String("casbin.LoadPolicy()", err.Error()))
return nil
}
return enforcer
}
// GetRolesForUser 获取角色
func GetRolesForUser(tenantId consts.TenantId, uid uint) []string {
uids, err := Instance(tenantId).GetRolesForUser(strconv.FormatUint(uint64(uid), 10))
if err != nil {
return []string{}
}
return uids
}
// GetPermissionsForUser 获取角色权限
func GetPermissionsForUser(tenantId consts.TenantId, id string) [][]string {
return Instance(tenantId).GetPermissionsForUser(id)
}