Skip to content

Commit 0bdf9de

Browse files
committed
Finished the Pymongo adapter
Signed-off-by: Andy Xia <118010339@link.cuhk.edu.cn>
1 parent 11cb330 commit 0bdf9de

2 files changed

Lines changed: 56 additions & 61 deletions

File tree

casbin_pymongo_adapter/adapter.py

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -80,40 +80,24 @@ def _save_policy_line(self, ptype, rule):
8080
line.v4 = rule[4]
8181
if len(rule) > 5:
8282
line.v5 = rule[5]
83-
self._collection.insert_one(line.dict)
83+
self._collection.insert_one(line.dict())
8484

8585
def save_policy(self, model):
8686
'''
8787
implementing add Interface for casbin \n
8888
save the policy in mongodb \n
8989
'''
90-
# for sec in ["p", "g"]:
91-
# if sec not in model.model.keys():
92-
# continue
93-
# for ptype, ast in model.model[sec].items():
94-
# for rule in ast.policy:
95-
# self._save_policy_line(ptype, rule)
96-
# return True
97-
self._collection.insert_one(model.dict)
90+
for sec in ["p", "g"]:
91+
if sec not in model.model.keys():
92+
continue
93+
for ptype, ast in model.model[sec].items():
94+
for rule in ast.policy:
95+
self._save_policy_line(ptype, rule)
96+
return True
9897

9998
def add_policy(self, sec, ptype, rule):
10099
"""add policy rules to mongodb"""
101-
# self._save_policy_line(ptype, rule)
102-
line = CasbinRule(ptype = ptype)
103-
if len(rule) > 0:
104-
line.v0 = rule[0]
105-
if len(rule) > 1:
106-
line.v1 = rule[1]
107-
if len(rule) > 2:
108-
line.v2 = rule[2]
109-
if len(rule) > 3:
110-
line.v3 = rule[3]
111-
if len(rule) > 4:
112-
line.v4 = rule[4]
113-
if len(rule) > 5:
114-
line.v5 = rule[5]
115-
self.save_policy(line)
116-
100+
self._save_policy_line(ptype, rule)
117101

118102
def remove_policy(self, sec, ptype, rule):
119103
"""delete policy rules from mongodb"""

tests/test_adapter.py

Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from unittest import TestCase
44
import casbin
55
import os
6-
import simpleeval
6+
77

88
def get_fixture(path):
99
'''
@@ -15,16 +15,28 @@ def get_fixture(path):
1515

1616
def get_enforcer():
1717
adapter = Adapter('mongodb://localhost:27017', 'casbin_test')
18-
c1 = CasbinRule(ptype='p', v0='alice', v1='data1', v2='read')
19-
adapter.save_policy(c1)
20-
c2 = CasbinRule(ptype='p', v0='bob', v1='data2', v2='write')
21-
adapter.save_policy(c2)
22-
c3 = CasbinRule(ptype='p', v0='data2_admin', v1='data2', v2='read')
23-
adapter.save_policy(c3)
24-
c4 = CasbinRule(ptype='p', v0='data2_admin', v1='data2', v2='write')
25-
adapter.save_policy(c4)
26-
c5 = CasbinRule(ptype='g', v0='alice', v1='data2_admin')
27-
adapter.save_policy(c5)
18+
19+
e = casbin.Enforcer(get_fixture('rbac_model.conf'), adapter, True)
20+
model = e.get_model()
21+
model.clear_policy()
22+
model.add_policy('p', 'p', ['alice', 'data1', 'read'])
23+
adapter.save_policy(model)
24+
25+
model.clear_policy()
26+
model.add_policy('p', 'p', ['bob', 'data2', 'write'])
27+
adapter.save_policy(model)
28+
29+
model.clear_policy()
30+
model.add_policy('p', 'p', ['data2_admin', 'data2', 'read'])
31+
adapter.save_policy(model)
32+
33+
model.clear_policy()
34+
model.add_policy('p', 'p', ['data2_admin', 'data2', 'write'])
35+
adapter.save_policy(model)
36+
37+
model.clear_policy()
38+
model.add_policy('g', 'g', ['alice', 'data2_admin'])
39+
adapter.save_policy(model)
2840

2941
return casbin.Enforcer(get_fixture('rbac_model.conf'), adapter, True)
3042

@@ -39,8 +51,8 @@ def test_enforcer_basic(self):
3951
test policy
4052
'''
4153
e = get_enforcer()
42-
self.assertFalse(e.enforce('alice', 'data1', 'write'))
43-
self.assertFalse(e.enforce('bob', 'data1', 'read'))
54+
self.assertTrue(e.enforce('alice', 'data1', 'read'))
55+
self.assertTrue(e.enforce('bob', 'data2', 'write'))
4456
self.assertTrue(e.enforce('bob', 'data2', 'write'))
4557
self.assertTrue(e.enforce('alice', 'data2', 'read'))
4658
self.assertTrue(e.enforce('alice', 'data2', 'write'))
@@ -49,20 +61,9 @@ def test_add_policy(self):
4961
'''
5062
test add_policy
5163
'''
52-
adapter = Adapter('mongodb://localhost:27017', 'casbin_test')
64+
adapter = Adapter('mongodb://localhost:27017', 'casbin_rule')
5365
e = casbin.Enforcer(get_fixture('rbac_model.conf'), adapter, True)
5466

55-
try:
56-
self.assertFalse(e.enforce('alice', 'data1', 'write'))
57-
self.assertFalse(e.enforce('bob', 'data1', 'read'))
58-
self.assertFalse(e.enforce('bob', 'data2', 'write'))
59-
self.assertFalse(e.enforce('alice', 'data2', 'read'))
60-
self.assertFalse(e.enforce('alice', 'data2', 'write'))
61-
except simpleeval.NameNotDefined:
62-
# This is caused by an upstream bug when there is no policy loaded
63-
# Should be resolved in pycasbin >= 0.3
64-
pass
65-
6667
adapter.add_policy(sec=None, ptype='p', rule=['alice', 'data1', 'read'])
6768
adapter.add_policy(sec=None, ptype='p', rule=['bob', 'data2', 'write'])
6869
adapter.add_policy(sec=None, ptype='p', rule=['data2_admin', 'data2', 'read'])
@@ -82,23 +83,33 @@ def test_save_policy(self):
8283
'''
8384
test save_policy
8485
'''
85-
model = casbin.Enforcer(get_fixture('rbac_model.conf'), get_fixture('rbac_policy.csv')).model
86-
adapter = Adapter('mongodb://localhost:27017', 'casbin_test')
86+
87+
e = get_enforcer()
88+
self.assertFalse(e.enforce('alice', 'data4', 'read'))
89+
90+
model = e.get_model()
91+
model.clear_policy()
92+
93+
model.add_policy('p', 'p', ['alice', 'data4', 'read'])
94+
95+
adapter = e.get_adapter()
8796
adapter.save_policy(model)
88-
e = casbin.Enforcer(get_fixture('rbac_model.conf'), adapter)
8997

90-
self.assertFalse(e.enforce('alice', 'data1', 'read'))
91-
self.assertFalse(e.enforce('bob', 'data1', 'read'))
92-
self.assertTrue(e.enforce('bob', 'data2', 'write'))
93-
self.assertTrue(e.enforce('alice', 'data2', 'read'))
94-
self.assertTrue(e.enforce('alice', 'data2', 'write'))
98+
self.assertTrue(e.enforce('alice', 'data4', 'read'))
9599

96100
def test_str(self):
97101
'''
98102
test __str__ function
99103
'''
100104
rule = CasbinRule(ptype='p', v0='alice', v1='data1', v2='read')
101-
self.assertEqual(str(rule), 'p, alice, data1, read')
105+
self.assertEqual(rule.__str__(), 'p, alice, data1, read')
106+
107+
def test_dict(self):
108+
'''
109+
test __str__ function
110+
'''
111+
rule = CasbinRule(ptype='p', v0='alice', v1='data1', v2='read')
112+
self.assertEqual(rule.dict(), {"ptype": 'p', "v0": 'alice', "v1": 'data1', "v2": 'read'})
102113

103114
def test_repr(self):
104115
'''
@@ -107,5 +118,5 @@ def test_repr(self):
107118
adapter = Adapter('mongodb://localhost:27017', 'casbin_test')
108119
rule = CasbinRule(ptype='p', v0='alice', v1='data1', v2='read')
109120
self.assertEqual(repr(rule), '<CasbinRule :"p, alice, data1, read">')
110-
adapter.save_policy(rule)
111-
self.assertRegex(repr(rule), r'<CasbinRule :"p, alice, data1, read">')
121+
# adapter.save_policy(rule)
122+
# self.assertRegex(repr(rule), r'<CasbinRule :"p, alice, data1, read">')

0 commit comments

Comments
 (0)