/
casbin.go
63 lines (50 loc) · 1.26 KB
/
casbin.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
package service
import (
"context"
"sync"
"time"
"github.com/sirupsen/logrus"
"github.com/QOSGroup/litewallet/pkg/user/entity"
"github.com/casbin/casbin"
"github.com/casbin/casbin/v2/model"
)
var _ entity.PermService = (*CasbinService)(nil)
var once sync.Once
type CasbinService struct {
permRepo entity.OrgRepo
enforcer *casbin.SyncedEnforcer
log *logrus.Entry
}
func NewCasbinService(permRepo entity.OrgRepo, log *logrus.Entry) *CasbinService {
s := &CasbinService{
permRepo: permRepo,
log: log.WithField("module", "domain.CasbinService"),
}
once.Do(func() {
//a, _ := gormadapter.NewAdapterByDB()
text := `
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act
`
m, err := model.NewModelFromString(text)
if err != nil {
return
}
enforcer := casbin.NewSyncedEnforcer(m)
_ = enforcer.LoadPolicy()
enforcer.StartAutoLoadPolicy(time.Second * 60) // 60秒更新一次
s.enforcer = enforcer
})
return s
}
func (s CasbinService) Enforce(ctx context.Context, sub, obj, act string) bool {
return s.enforcer.Enforce(sub, obj, act)
}