/
mycasbin.go
96 lines (82 loc) · 2.07 KB
/
mycasbin.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package mycasbin
import (
"sync"
"github.com/devops-base/devops-core/logger"
"github.com/devops-base/devops-core/sdk"
"github.com/devops-base/devops-core/sdk/config"
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/log"
"github.com/casbin/casbin/v2/model"
redisWatcher "github.com/go-admin-team/redis-watcher/v2"
"github.com/go-redis/redis/v9"
"gorm.io/gorm"
gormAdapter "github.com/go-admin-team/gorm-adapter/v3"
)
// Initialize the model from a string.
var text = `
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && (keyMatch2(r.obj, p.obj) || keyMatch(r.obj, p.obj)) && (r.act == p.act || p.act == "*")
`
var (
enforcer *casbin.SyncedEnforcer
once sync.Once
)
func Setup(db *gorm.DB, _ string) *casbin.SyncedEnforcer {
once.Do(func() {
Apter, err := gormAdapter.NewAdapterByDBUseTableName(db, "sys", "casbin_rule")
if err != nil && err.Error() != "invalid DDL" {
panic(err)
}
m, err := model.NewModelFromString(text)
if err != nil {
panic(err)
}
enforcer, err = casbin.NewSyncedEnforcer(m, Apter)
if err != nil {
panic(err)
}
err = enforcer.LoadPolicy()
if err != nil {
panic(err)
}
// set redis watcher if redis config is not nil
if config.CacheConfig.Redis != nil {
w, err := redisWatcher.NewWatcher(config.CacheConfig.Redis.Addr, redisWatcher.WatcherOptions{
Options: redis.Options{
Network: "tcp",
Password: config.CacheConfig.Redis.Password,
},
Channel: "/casbin",
IgnoreSelf: false,
})
if err != nil {
panic(err)
}
err = w.SetUpdateCallback(updateCallback)
if err != nil {
panic(err)
}
err = enforcer.SetWatcher(w)
if err != nil {
panic(err)
}
}
log.SetLogger(&Logger{})
enforcer.EnableLog(true)
})
return enforcer
}
func updateCallback(msg string) {
l := logger.NewHelper(sdk.Runtime.GetLogger())
l.Infof("casbin updateCallback msg: %v", msg)
err := enforcer.LoadPolicy()
if err != nil {
l.Errorf("casbin LoadPolicy err: %v", err)
}
}