Skip to content

Commit bf936fa

Browse files
authored
Merge pull request #1 from princekrroshan01/master
first commit
2 parents aa7d076 + d66a598 commit bf936fa

File tree

5 files changed

+159
-0
lines changed

5 files changed

+159
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .adapter import CasbinRule, Adapter
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from casbin import persist
2+
from sqlobject import SQLObject, StringCol, sqlhub, connectionForURI
3+
4+
5+
class CasbinRule(SQLObject):
6+
class sqlmeta:
7+
8+
table = "casbin_rule"
9+
10+
ptype = StringCol(length=255)
11+
v0 = StringCol(length=255, default=None)
12+
v1 = StringCol(length=255, default=None)
13+
v2 = StringCol(length=255, default=None)
14+
v3 = StringCol(length=255, default=None)
15+
v4 = StringCol(length=255, default=None)
16+
v5 = StringCol(length=255, default=None)
17+
18+
def __str__(self):
19+
arr = [self.ptype]
20+
for v in (self.v0, self.v1, self.v2, self.v3, self.v4, self.v5):
21+
if v is None:
22+
break
23+
arr.append(v)
24+
return ", ".join(arr)
25+
26+
def __repr__(self):
27+
return '<CasbinRule {}: "{}">'.format(self.id, str(self))
28+
29+
30+
class Adapter(persist.Adapter):
31+
"""the interface for Casbin adapters."""
32+
33+
def __init__(self, connection_string):
34+
self._conhandler = connectionForURI(connection_string)
35+
sqlhub.processConnection = self._conhandler
36+
37+
def load_policy(self, model):
38+
"""loads all policy rules from the storage."""
39+
count = CasbinRule.select().count()
40+
for i in range(1, 1 + count):
41+
line = CasbinRule.get(i)
42+
persist.load_policy_line(str(line), model)
43+
44+
def _save_policy_line(self, ptype, rule):
45+
line = CasbinRule.selectBy(ptype=ptype)
46+
for i, v in enumerate(rule):
47+
setattr(line, "v{}".format(i), v)
48+
49+
def save_policy(self, model):
50+
"""saves all policy rules to the storage."""
51+
for sec in ["p", "g"]:
52+
if sec not in model.model.keys():
53+
continue
54+
for ptype, ast in model.model[sec].items():
55+
for rule in ast.policy:
56+
self._save_policy_line(ptype, rule)
57+
58+
return True
59+
60+
def add_policy(self, sec, ptype, rule):
61+
"""adds a policy rule to the storage."""
62+
self._save_policy_line(ptype, rule)
63+
64+
def remove_policy(self, sec, ptype, rule):
65+
"""removes a policy rule from the storage."""
66+
pass
67+
68+
def remove_filtered_policy(self, sec, ptype, field_index, *field_values):
69+
"""removes policy rules that match the filter from the storage.
70+
This is part of the Auto-Save feature.
71+
"""
72+
pass

tests/rbac_model.conf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[request_definition]
2+
r = sub, obj, act
3+
4+
[policy_definition]
5+
p = sub, obj, act
6+
7+
[role_definition]
8+
g = _, _
9+
10+
[policy_effect]
11+
e = some(where (p.eft == allow))
12+
13+
[matchers]
14+
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

tests/rbac_policy.csv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
p, alice, data1, read
2+
p, bob, data2, write
3+
p, data2_admin, data2, read
4+
p, data2_admin, data2, write
5+
6+
g, alice, data2_admin

tests/test_adapter.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import os
2+
import unittest
3+
4+
import casbin
5+
6+
from casbin_sqlobject_adapter import Adapter
7+
from casbin_sqlobject_adapter import CasbinRule
8+
9+
10+
def get_fixture(path):
11+
dir_path = os.path.split(os.path.realpath(__file__))[0] + "/"
12+
return os.path.abspath(dir_path + path)
13+
14+
15+
def get_enforcer():
16+
con_string = "sqlite:/:memory:"
17+
adapter = Adapter(con_string)
18+
19+
CasbinRule.createTable(ifNotExists=True)
20+
CasbinRule(ptype="p", v0="alice", v1="data1", v2="read")
21+
CasbinRule(ptype="p", v0="bob", v1="data2", v2="write")
22+
CasbinRule(ptype="p", v0="data2_admin", v1="data2", v2="read")
23+
CasbinRule(ptype="p", v0="data2_admin", v1="data2", v2="write")
24+
CasbinRule(ptype="g", v0="alice", v1="data2_admin")
25+
26+
return casbin.Enforcer(get_fixture("rbac_model.conf"), adapter)
27+
28+
29+
class TestConfig(unittest.TestCase):
30+
def test_enforcer_basic(self):
31+
e = get_enforcer()
32+
33+
self.assertTrue(e.enforce("alice", "data1", "read"))
34+
self.assertFalse(e.enforce("bob", "data1", "read"))
35+
self.assertTrue(e.enforce("bob", "data2", "write"))
36+
self.assertTrue(e.enforce("alice", "data2", "read"))
37+
self.assertTrue(e.enforce("alice", "data2", "write"))
38+
39+
def test_add_policy(self):
40+
e = get_enforcer()
41+
42+
self.assertFalse(e.enforce("eve", "data3", "read"))
43+
res = e.add_permission_for_user("eve", "data3", "read")
44+
self.assertTrue(res)
45+
self.assertTrue(e.enforce("eve", "data3", "read"))
46+
47+
def test_save_policy(self):
48+
e = get_enforcer()
49+
self.assertFalse(e.enforce("alice", "data4", "read"))
50+
51+
model = e.get_model()
52+
model.clear_policy()
53+
54+
model.add_policy("p", "p", ["alice", "data4", "read"])
55+
56+
adapter = e.get_adapter()
57+
adapter.save_policy(model)
58+
self.assertTrue(e.enforce("alice", "data4", "read"))
59+
60+
def test_str(self):
61+
rule = CasbinRule(ptype="p", v0="alice", v1="data1", v2="read")
62+
self.assertEqual(str(rule), "p, alice, data1, read")
63+
64+
def test_repr(self):
65+
rule = CasbinRule(ptype="p", v0="alice", v1="data1", v2="read")
66+
self.assertRegex(repr(rule), r'<CasbinRule \d+: "p, alice, data1, read">')

0 commit comments

Comments
 (0)