Skip to content

Commit ca84dac

Browse files
feat: update_filtered_policies (#249)
1 parent f757024 commit ca84dac

4 files changed

Lines changed: 70 additions & 0 deletions

File tree

casbin/internal_enforcer.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,37 @@ def _update_policies(self, sec, ptype, old_rules, new_rules):
8888

8989
return rules_updated
9090

91+
def _update_filtered_policies(
92+
self, sec, ptype, new_rules, field_index, *field_values
93+
):
94+
"""_update_filtered_policies deletes old rules and adds new rules."""
95+
96+
old_rules = self.model.get_filtered_policy(
97+
sec, ptype, field_index, *field_values
98+
)
99+
100+
if self.adapter and self.auto_save:
101+
try:
102+
old_rules = self.adapter.update_filtered_policies(
103+
sec, ptype, new_rules, field_index, *field_values
104+
)
105+
except:
106+
pass
107+
108+
if not old_rules:
109+
return False
110+
111+
is_rule_changed = self.model.remove_policies(sec, ptype, old_rules)
112+
self.model.add_policies(sec, ptype, new_rules)
113+
is_rule_changed = is_rule_changed and len(new_rules) != 0
114+
if not is_rule_changed:
115+
return is_rule_changed
116+
if sec == "g":
117+
self.build_role_links()
118+
if self.watcher:
119+
self.watcher.update()
120+
return is_rule_changed
121+
91122
def _remove_policy(self, sec, ptype, rule):
92123
"""removes a rule from the current policy."""
93124
rule_removed = self.model.remove_policy(sec, ptype, rule)

casbin/management_enforcer.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,20 @@ def update_named_policies(self, ptype, old_rules, new_rules):
151151
"""updates authorization rules from the current named policy."""
152152
return self._update_policies("p", ptype, old_rules, new_rules)
153153

154+
def update_filtered_policies(self, new_rules, field_index, *field_values):
155+
"""update_filtered_policies deletes old rules and adds new rules."""
156+
return self.update_filtered_named_policies(
157+
"p", new_rules, field_index, *field_values
158+
)
159+
160+
def update_filtered_named_policies(
161+
self, ptype, new_rules, field_index, *field_values
162+
):
163+
"""update_filtered_named_policies deletes old rules and adds new rules."""
164+
return self._update_filtered_policies(
165+
"p", ptype, new_rules, field_index, *field_values
166+
)
167+
154168
def remove_policy(self, *params):
155169
"""removes an authorization rule from the current policy."""
156170
return self.remove_named_policy("p", *params)

casbin/persist/adapters/update_adapter.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,11 @@ def update_policies(self, sec, ptype, old_rules, new_rules):
2828
UpdatePolicies updates some policy rules to storage, like db, redis.
2929
"""
3030
pass
31+
32+
def update_filtered_policies(
33+
self, sec, ptype, new_rules, field_index, *field_values
34+
):
35+
"""
36+
update_filtered_policies deletes old rules and adds new rules.
37+
"""
38+
pass

tests/test_management_api.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,23 @@ def test_get_policy_api(self):
115115
self.assertTrue(e.has_grouping_policy(["alice", "data2_admin"]))
116116
self.assertFalse(e.has_grouping_policy(["bob", "data2_admin"]))
117117

118+
def test_update_filtered_policies(self):
119+
e = casbin.Enforcer(
120+
get_examples("rbac_model.conf"),
121+
get_examples("rbac_policy.csv"),
122+
)
123+
124+
e.update_filtered_policies(
125+
[
126+
["data2_admin", "data3", "read"],
127+
["data2_admin", "data3", "write"],
128+
],
129+
0,
130+
"data2_admin",
131+
)
132+
self.assertTrue(e.enforce("data2_admin", "data3", "write"))
133+
self.assertTrue(e.enforce("data2_admin", "data3", "read"))
134+
118135
def test_get_policy_matching_function(self):
119136
e = self.get_enforcer(
120137
get_examples("rbac_with_domain_and_policy_pattern_model.conf"),

0 commit comments

Comments
 (0)