Skip to content

Commit 173cde3

Browse files
committed
#207: allowed usage of groups in allowed_users and admin_users
1 parent 9cd69a2 commit 173cde3

2 files changed

Lines changed: 50 additions & 28 deletions

File tree

src/auth/authorization.py

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,16 @@
77

88
class Authorizer:
99
def __init__(self, app_allowed_users, admin_users, groups_provider):
10-
self._app_auth_check = self.init_auth_check(app_allowed_users)
11-
self._admin_check = self.init_auth_check(admin_users)
10+
self._app_allowed_users = app_allowed_users
11+
self._admin_users = admin_users
1212

1313
self._groups_provider = groups_provider
1414

15-
def init_auth_check(self, users):
16-
if ANY_USER in users:
17-
return AnyUserAuthorizationCheck()
18-
else:
19-
return ListBasedAuthorizationCheck(users)
20-
2115
def is_allowed_in_app(self, user_id):
22-
return self._app_auth_check.is_allowed(user_id)
16+
return self.is_allowed(user_id, self._app_allowed_users)
2317

2418
def is_admin(self, user_id):
25-
return self._admin_check.is_allowed(user_id)
19+
return self.is_allowed(user_id, self._admin_users)
2620

2721
def is_allowed(self, user_id, allowed_users):
2822
if not allowed_users:
@@ -45,20 +39,6 @@ def is_allowed(self, user_id, allowed_users):
4539
return False
4640

4741

48-
class ListBasedAuthorizationCheck:
49-
def __init__(self, allowed_users) -> None:
50-
self.allowed_users = set(allowed_users)
51-
52-
def is_allowed(self, user_id):
53-
return user_id in self.allowed_users
54-
55-
56-
class AnyUserAuthorizationCheck:
57-
@staticmethod
58-
def is_allowed(user_id):
59-
return True
60-
61-
6242
class EmptyGroupProvider:
6343

6444
def get_groups(self, user):
@@ -127,6 +107,7 @@ def get_groups(self, user):
127107

128108
def create_group_provider(user_groups, authenticator, admin_users):
129109
if admin_users:
110+
admin_users = _exclude_unknown_groups_from_admin_users(admin_users, user_groups)
130111
if user_groups is None:
131112
user_groups = {ADMIN_GROUP: admin_users}
132113
elif ADMIN_GROUP not in user_groups:
@@ -142,3 +123,20 @@ def create_group_provider(user_groups, authenticator, admin_users):
142123
return preconfigured_groups_provider
143124

144125
return CombinedGroupProvider(preconfigured_groups_provider, authenticator)
126+
127+
128+
# in case groups will be loaded from ldap
129+
def _exclude_unknown_groups_from_admin_users(admin_users, known_groups):
130+
if not admin_users or not known_groups:
131+
return admin_users
132+
133+
result = []
134+
for user in admin_users:
135+
if user.startswith(GROUP_PREFIX):
136+
group = user[1:]
137+
if group not in known_groups.keys():
138+
continue
139+
140+
result.append(user)
141+
142+
return result

src/tests/authorization_test.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,15 @@ def test_any_user_allowed(self):
7878
def test_any_user_allowed_when_mixed(self):
7979
self.assertAllowed('user5', ['user1', ANY_USER, 'user2'], True)
8080

81-
def assertAllowed(self, user, allowed_users, expected_allowed):
82-
authorizer = Authorizer(allowed_users, [], EmptyGroupProvider())
81+
def test_allowed_user_when_in_group(self):
82+
self.assertAllowed('user5', ['user1', 'user2', '@my_group'], True, groups={'my_group': ['user5']})
83+
84+
def test_not_allowed_user_when_not_in_group(self):
85+
self.assertAllowed('user5', ['user1', 'user2', '@my_group'], False, groups={'my_group': ['user3']})
86+
87+
def assertAllowed(self, user, allowed_users, expected_allowed, groups=None):
88+
group_provider = PreconfiguredGroupProvider(groups) if groups else EmptyGroupProvider()
89+
authorizer = Authorizer(allowed_users, [], group_provider)
8390

8491
allowed = authorizer.is_allowed_in_app(user)
8592
if allowed != expected_allowed:
@@ -103,8 +110,15 @@ def test_any_user_is_admin(self):
103110
def test_any_admin_when_mixed(self):
104111
self.assertAdmin('admin5', ['admin1', ANY_USER, 'admin2'], True)
105112

106-
def assertAdmin(self, user, admin_users, expected_allowed):
107-
authorizer = Authorizer([], admin_users, EmptyGroupProvider())
113+
def test_is_admin_when_in_group(self):
114+
self.assertAdmin('admin5', ['admin1', 'admin2', '@my_group'], True, groups={'my_group': ['admin5']})
115+
116+
def test_not_admin_admin_when_not_in_group(self):
117+
self.assertAdmin('admin5', ['admin1', 'admin2', '@my_group'], False, groups={'my_group': ['admin3']})
118+
119+
def assertAdmin(self, user, admin_users, expected_allowed, groups=None):
120+
group_provider = PreconfiguredGroupProvider(groups) if groups else EmptyGroupProvider()
121+
authorizer = Authorizer([], admin_users, group_provider)
108122

109123
allowed = authorizer.is_admin(user)
110124
if allowed != expected_allowed:
@@ -183,6 +197,16 @@ def test_create_from_group_and_admin_users_when_admin_group_exists(self):
183197
self.assertCountEqual(provider.get_groups('user1'), ['group1'])
184198
self.assertCountEqual(provider.get_groups('user2'), ['admin_users'])
185199

200+
def test_create_from_group_and_admin_users_when_admin_group_has_unknown_group(self):
201+
provider = create_group_provider({'group1': ['user1']}, None, ['user2', '@some_group'])
202+
self.assertCountEqual(provider.get_groups('user1'), ['group1'])
203+
self.assertCountEqual(provider.get_groups('user2'), ['admin_users'])
204+
205+
def test_create_from_group_including_admin_users_when_admin_group_has_unknown_group(self):
206+
provider = create_group_provider({'group1': ['user1', '@admin_users']}, None, ['user2', '@some_group'])
207+
self.assertCountEqual(provider.get_groups('user1'), ['group1'])
208+
self.assertCountEqual(provider.get_groups('user2'), ['admin_users', 'group1'])
209+
186210
def test_create_from_groups_and_empty_authenticator(self):
187211
auth = self._create_authenticator({})
188212
provider = create_group_provider({'group1': ['user1']}, auth, None)

0 commit comments

Comments
 (0)