Skip to content

Commit 8486b91

Browse files
committed
fix: improve policyManager
Signed-off-by: Zixuan Liu <nodeces@gmail.com>
1 parent d9f533d commit 8486b91

File tree

5 files changed

+85
-129
lines changed

5 files changed

+85
-129
lines changed

api/manager.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2020 The casbin Authors. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package api
16+
17+
// PolicyManager is the policy manager for model and adapter
18+
type PolicyManager interface {
19+
AddPolicies(sec string, ptype string, rules [][]string) ([][]string, error)
20+
RemovePolicies(sec string, ptype string, rules [][]string) ([][]string, error)
21+
RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) ([][]string, error)
22+
}

enforcer.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"time"
2323

2424
"github.com/Knetic/govaluate"
25+
"github.com/casbin/casbin/v3/api"
2526
"github.com/casbin/casbin/v3/effect"
2627
"github.com/casbin/casbin/v3/internal"
2728
"github.com/casbin/casbin/v3/log"
@@ -45,7 +46,7 @@ type Enforcer struct {
4546
dispatcher persist.Dispatcher
4647
rm rbac.RoleManager
4748

48-
internal internal.PolicyManager
49+
policyManager api.PolicyManager
4950
enabled bool
5051
autoSave bool
5152
autoBuildRoleLinks bool
@@ -159,7 +160,7 @@ func (e *Enforcer) InitWithModelAndAdapter(m model.Model, adapter persist.Adapte
159160
e.model.PrintModel()
160161
e.fm = model.LoadFunctionMap()
161162
e.initialize()
162-
e.internal = internal.NewPolicyManager(m, adapter, e.rm)
163+
e.policyManager = internal.NewPolicyManager(m, adapter, e.rm, e.shouldPersist)
163164
// Do not initialize the full policy when using a filtered adapter
164165
fa, ok := e.adapter.(persist.FilteredAdapter)
165166
if e.adapter != nil && (!ok || ok && !fa.IsFiltered()) {
@@ -209,7 +210,7 @@ func (e *Enforcer) GetModel() model.Model {
209210
func (e *Enforcer) SetModel(m model.Model) {
210211
e.model = m
211212
e.fm = model.LoadFunctionMap()
212-
e.internal = internal.NewPolicyManager(m, e.adapter, e.rm)
213+
e.policyManager = internal.NewPolicyManager(m, e.adapter, e.rm, e.shouldPersist)
213214
e.initialize()
214215
}
215216

@@ -221,12 +222,12 @@ func (e *Enforcer) GetAdapter() persist.Adapter {
221222
// SetAdapter sets the current adapter.
222223
func (e *Enforcer) SetAdapter(adapter persist.Adapter) {
223224
e.adapter = adapter
224-
e.internal = internal.NewPolicyManager(e.model, adapter, e.rm)
225+
e.policyManager = internal.NewPolicyManager(e.model, e.adapter, e.rm, e.shouldPersist)
225226
}
226227

227228
// GetPolicyManager gets the current policy manager.
228-
func (e *Enforcer) GetPolicyManager() internal.PolicyManager {
229-
return e.internal
229+
func (e *Enforcer) GetPolicyManager() api.PolicyManager {
230+
return e.policyManager
230231
}
231232

232233
// SetWatcher sets the current watcher.
@@ -249,7 +250,7 @@ func (e *Enforcer) GetRoleManager() rbac.RoleManager {
249250
// SetRoleManager sets the current role manager.
250251
func (e *Enforcer) SetRoleManager(rm rbac.RoleManager) {
251252
e.rm = rm
252-
e.internal = internal.NewPolicyManager(e.model, e.adapter, rm)
253+
e.policyManager = internal.NewPolicyManager(e.model, e.adapter, rm, e.shouldPersist)
253254
}
254255

255256
// SetEffector sets the current effector.

internal/internal.go

Lines changed: 32 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -15,77 +15,47 @@
1515
package internal
1616

1717
import (
18+
"github.com/casbin/casbin/v3/api"
1819
"github.com/casbin/casbin/v3/errors"
1920
"github.com/casbin/casbin/v3/model"
2021
"github.com/casbin/casbin/v3/persist"
2122
"github.com/casbin/casbin/v3/rbac"
2223
)
2324

24-
// PolicyManager is the policy manager for model and adapter
25-
type PolicyManager interface {
26-
AddPolicy(sec string, ptype string, rule []string, shouldPersist bool) (bool, error)
27-
AddPolicies(sec string, ptype string, rules [][]string, shouldPersist bool) (bool, [][]string, error)
28-
RemovePolicy(sec string, ptype string, rule []string, shouldPersist bool) (bool, error)
29-
RemovePolicies(sec string, ptype string, rules [][]string, shouldPersist bool) (bool, [][]string, error)
30-
RemoveFilteredPolicy(sec string, ptype string, shouldPersist bool, fieldIndex int, fieldValues ...string) (bool, [][]string, error)
31-
}
25+
var _ api.PolicyManager = &policyManager{}
3226

3327
type policyManager struct {
34-
model model.Model
35-
adapter persist.Adapter
36-
rm rbac.RoleManager
28+
model model.Model
29+
adapter persist.Adapter
30+
rm rbac.RoleManager
31+
shouldPersist func() bool
3732
}
3833

3934
const (
4035
notImplemented = "not implemented"
4136
)
4237

4338
// NewPolicyManager is the constructor for PolicyManager
44-
func NewPolicyManager(model model.Model, adapter persist.Adapter, rm rbac.RoleManager) PolicyManager {
39+
func NewPolicyManager(model model.Model, adapter persist.Adapter, rm rbac.RoleManager, shouldPersist func() bool) api.PolicyManager {
4540
return &policyManager{
46-
model: model,
47-
adapter: adapter,
48-
rm: rm,
49-
}
50-
}
51-
52-
// AddPolicy adds a rule to model and adapter.
53-
func (p *policyManager) AddPolicy(sec string, ptype string, rule []string, shouldPersist bool) (bool, error) {
54-
if p.model.HasPolicy(sec, ptype, rule) {
55-
return false, nil
56-
}
57-
58-
if shouldPersist {
59-
if err := p.adapter.AddPolicy(sec, ptype, rule); err != nil {
60-
if err.Error() != notImplemented {
61-
return false, err
62-
}
63-
}
64-
}
65-
66-
p.model.AddPolicy(sec, ptype, rule)
67-
68-
if sec == "g" {
69-
err := p.model.BuildIncrementalRoleLinks(p.rm, model.PolicyAdd, "g", ptype, [][]string{rule})
70-
if err != nil {
71-
return true, err
72-
}
41+
model: model,
42+
adapter: adapter,
43+
rm: rm,
44+
shouldPersist: shouldPersist,
7345
}
74-
75-
return true, nil
7646
}
7747

7848
// AddPolicies adds rules to model and adapter.
79-
func (p *policyManager) AddPolicies(sec string, ptype string, rules [][]string, shouldPersist bool) (bool, [][]string, error) {
80-
rules = p.model.RemoveExistPolicy(sec, ptype, rules)
49+
func (p *policyManager) AddPolicies(sec string, ptype string, rules [][]string) ([][]string, error) {
50+
rules = p.model.FilterNotExistPolicy(sec, ptype, rules)
8151
if len(rules) == 0 {
82-
return true, nil, nil
52+
return nil, nil
8353
}
8454

85-
if shouldPersist {
55+
if p.shouldPersist() {
8656
if err := p.adapter.(persist.BatchAdapter).AddPolicies(sec, ptype, rules); err != nil {
8757
if err.Error() != notImplemented {
88-
return false, nil, err
58+
return nil, err
8959
}
9060
}
9161
}
@@ -95,93 +65,67 @@ func (p *policyManager) AddPolicies(sec string, ptype string, rules [][]string,
9565
if sec == "g" {
9666
err := p.model.BuildIncrementalRoleLinks(p.rm, model.PolicyAdd, "g", ptype, rules)
9767
if err != nil {
98-
return true, rules, err
99-
}
100-
}
101-
102-
return true, rules, nil
103-
}
104-
105-
// RemovePolicy removes a rule from model and adapter.
106-
func (p *policyManager) RemovePolicy(sec string, ptype string, rule []string, shouldPersist bool) (bool, error) {
107-
if shouldPersist {
108-
if err := p.adapter.RemovePolicy(sec, ptype, rule); err != nil {
109-
if err.Error() != notImplemented {
110-
return false, err
111-
}
112-
}
113-
}
114-
115-
ruleRemoved := p.model.RemovePolicy(sec, ptype, rule)
116-
if !ruleRemoved {
117-
return ruleRemoved, nil
118-
}
119-
120-
if sec == "g" {
121-
err := p.model.BuildIncrementalRoleLinks(p.rm, model.PolicyRemove, "g", ptype, [][]string{rule})
122-
if err != nil {
123-
return ruleRemoved, err
68+
return rules, err
12469
}
12570
}
12671

127-
return ruleRemoved, nil
72+
return rules, nil
12873
}
12974

13075
// RemovePolicies removes rules from model and adapter.
131-
func (p *policyManager) RemovePolicies(sec string, ptype string, rules [][]string, shouldPersist bool) (bool, [][]string, error) {
132-
rules = p.model.RemoveNotExistPolicy(sec, ptype, rules)
76+
func (p *policyManager) RemovePolicies(sec string, ptype string, rules [][]string) ([][]string, error) {
13377
if len(rules) == 0 {
134-
return true, nil, nil
78+
return nil, nil
13579
}
13680

137-
if shouldPersist {
81+
if p.shouldPersist() {
13882
if err := p.adapter.(persist.BatchAdapter).RemovePolicies(sec, ptype, rules); err != nil {
13983
if err.Error() != notImplemented {
140-
return false, nil, err
84+
return nil, err
14185
}
14286
}
14387
}
14488

14589
rulesRemoved := p.model.RemovePolicies(sec, ptype, rules)
14690
if !rulesRemoved {
147-
return rulesRemoved, rules, nil
91+
return rules, nil
14892
}
14993

15094
if sec == "g" {
15195
err := p.model.BuildIncrementalRoleLinks(p.rm, model.PolicyRemove, "g", ptype, rules)
15296
if err != nil {
153-
return rulesRemoved, rules, err
97+
return rules, err
15498
}
15599
}
156100

157-
return rulesRemoved, rules, nil
101+
return rules, nil
158102
}
159103

160104
// RemoveFilteredPolicy removes rules based on field filters from model and adapter.
161-
func (p *policyManager) RemoveFilteredPolicy(sec string, ptype string, shouldPersist bool, fieldIndex int, fieldValues ...string) (bool, [][]string, error) {
105+
func (p *policyManager) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) ([][]string, error) {
162106
if len(fieldValues) == 0 {
163-
return false, nil, errors.INVALID_FIELDVAULES_PARAMETER
107+
return nil, errors.INVALID_FIELDVAULES_PARAMETER
164108
}
165109

166-
if shouldPersist {
110+
if p.shouldPersist() {
167111
if err := p.adapter.RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues...); err != nil {
168112
if err.Error() != notImplemented {
169-
return false, nil, err
113+
return nil, err
170114
}
171115
}
172116
}
173117

174118
ruleRemoved, effects := p.model.RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues...)
175119
if !ruleRemoved {
176-
return ruleRemoved, effects, nil
120+
return effects, nil
177121
}
178122

179123
if sec == "g" {
180124
err := p.model.BuildIncrementalRoleLinks(p.rm, model.PolicyRemove, "g", ptype, effects)
181125
if err != nil {
182-
return ruleRemoved, effects, err
126+
return effects, err
183127
}
184128
}
185129

186-
return ruleRemoved, effects, nil
130+
return effects, nil
187131
}

internal_api.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ func (e *Enforcer) addPolicy(sec string, ptype string, rule []string) (bool, err
3030
return true, e.dispatcher.AddPolicies(sec, ptype, [][]string{rule})
3131
}
3232

33-
if result, err := e.internal.AddPolicy(sec, ptype, rule, e.shouldPersist()); err != nil || !result {
34-
return result, err
33+
effects, err := e.policyManager.AddPolicies(sec, ptype, [][]string{rule})
34+
if err != nil || len(effects) == 0 {
35+
return false, err
3536
}
3637

3738
if e.watcher != nil && e.autoNotifyWatcher {
@@ -57,9 +58,9 @@ func (e *Enforcer) addPolicies(sec string, ptype string, rules [][]string) (bool
5758
return true, e.dispatcher.AddPolicies(sec, ptype, rules)
5859
}
5960

60-
result, effects, err := e.internal.AddPolicies(sec, ptype, rules, e.shouldPersist())
61-
if err != nil || !result {
62-
return result, err
61+
effects, err := e.policyManager.AddPolicies(sec, ptype, rules)
62+
if err != nil || len(effects) == 0 {
63+
return false, err
6364
}
6465

6566
if e.watcher != nil && e.autoNotifyWatcher {
@@ -82,9 +83,9 @@ func (e *Enforcer) removePolicy(sec string, ptype string, rule []string) (bool,
8283
return true, e.dispatcher.RemovePolicies(sec, ptype, [][]string{rule})
8384
}
8485

85-
ruleRemoved, err := e.internal.RemovePolicy(sec, ptype, rule, e.shouldPersist())
86-
if err != nil || !ruleRemoved {
87-
return ruleRemoved, err
86+
effects, err := e.policyManager.RemovePolicies(sec, ptype, [][]string{rule})
87+
if err != nil || len(effects) == 0 {
88+
return false, err
8889
}
8990

9091
if e.watcher != nil && e.autoNotifyWatcher {
@@ -94,15 +95,15 @@ func (e *Enforcer) removePolicy(sec string, ptype string, rule []string) (bool,
9495
} else {
9596
err = e.watcher.Update()
9697
}
97-
return ruleRemoved, err
98+
return true, err
9899

99100
}
100101

101102
if log.GetLogger().IsEnabled() {
102103
log.LogPrintf("Policy Management, Type: RemovePolicy Assertion %s::%s\nrule: %s", sec, ptype, util.ArrayToString(rule))
103104
}
104105

105-
return ruleRemoved, nil
106+
return true, nil
106107
}
107108

108109
// removePolicies removes rules from the current policy.
@@ -111,23 +112,23 @@ func (e *Enforcer) removePolicies(sec string, ptype string, rules [][]string) (b
111112
return true, e.dispatcher.RemovePolicies(sec, ptype, rules)
112113
}
113114

114-
rulesRemoved, effects, err := e.internal.RemovePolicies(sec, ptype, rules, e.shouldPersist())
115-
if err != nil || !rulesRemoved {
116-
return rulesRemoved, err
115+
effects, err := e.policyManager.RemovePolicies(sec, ptype, rules)
116+
if err != nil || len(effects) == 0 {
117+
return false, err
117118
}
118119

119120
if e.watcher != nil && e.autoNotifyWatcher {
120121
err := e.watcher.Update()
121122
if err != nil {
122-
return rulesRemoved, err
123+
return true, err
123124
}
124125
}
125126

126127
if log.GetLogger().IsEnabled() {
127128
log.LogPrintf("Policy Management, Type: RemovePolicies Assertion %s::%s\nrules: %s", sec, ptype, util.Array2DToString(effects))
128129
}
129130

130-
return rulesRemoved, nil
131+
return true, nil
131132
}
132133

133134
// removeFilteredPolicy removes rules based on field filters from the current policy.
@@ -136,9 +137,9 @@ func (e *Enforcer) removeFilteredPolicy(sec string, ptype string, fieldIndex int
136137
return true, e.dispatcher.RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues...)
137138
}
138139

139-
ruleRemoved, effects, err := e.internal.RemoveFilteredPolicy(sec, ptype, e.shouldPersist(), fieldIndex, fieldValues...)
140-
if err != nil || !ruleRemoved {
141-
return ruleRemoved, err
140+
effects, err := e.policyManager.RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues...)
141+
if err != nil || len(effects) == 0 {
142+
return false, err
142143
}
143144

144145
if e.watcher != nil && e.autoNotifyWatcher {
@@ -148,12 +149,12 @@ func (e *Enforcer) removeFilteredPolicy(sec string, ptype string, fieldIndex int
148149
} else {
149150
err = e.watcher.Update()
150151
}
151-
return ruleRemoved, err
152+
return true, err
152153
}
153154

154155
if log.GetLogger().IsEnabled() {
155156
log.LogPrintf("Policy Management, Type: RemoveFilteredPolicy Assertion: %s::%s\nrules: %s", sec, ptype, util.Array2DToString(effects))
156157
}
157158

158-
return ruleRemoved, nil
159+
return true, nil
159160
}

0 commit comments

Comments
 (0)