Skip to content

Commit d23ebba

Browse files
authored
Merge pull request #3 from Xhy-5000/master
Finish the Pymongo adapter for Pycasbin
2 parents f6d8f8f + 0bdf9de commit d23ebba

2 files changed

Lines changed: 64 additions & 70 deletions

File tree

casbin_pymongo_adapter/adapter.py

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@ class CasbinRule:
66
'''
77
CasbinRule model
88
'''
9-
ptype = None
10-
v0 = None
11-
v1 = None
12-
v2 = None
13-
v3 = None
14-
v4 = None
15-
v5 = None
16-
17-
def __init__(self, ptype):
9+
10+
def __init__(self, ptype = None, v0 = None, v1 = None, v2 = None, v3 = None, v4 = None, v5 = None):
1811
self.ptype = ptype
12+
self.v0 = v0
13+
self.v1 = v1
14+
self.v2 = v2
15+
self.v3 = v3
16+
self.v4 = v4
17+
self.v5 = v5
1918

2019
def dict(self):
2120
d = {'ptype': self.ptype}
@@ -81,40 +80,24 @@ def _save_policy_line(self, ptype, rule):
8180
line.v4 = rule[4]
8281
if len(rule) > 5:
8382
line.v5 = rule[5]
84-
self._collection.insert_one(line.dict)
83+
self._collection.insert_one(line.dict())
8584

8685
def save_policy(self, model):
8786
'''
8887
implementing add Interface for casbin \n
8988
save the policy in mongodb \n
9089
'''
91-
# for sec in ["p", "g"]:
92-
# if sec not in model.model.keys():
93-
# continue
94-
# for ptype, ast in model.model[sec].items():
95-
# for rule in ast.policy:
96-
# self._save_policy_line(ptype, rule)
97-
# return True
98-
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
9997

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

119102
def remove_policy(self, sec, ptype, rule):
120103
"""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)