Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 22 additions & 11 deletions azure_auth/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class AuthHandler:
Class to interface with `msal` package and execute authentication process.
"""

GROUPS_UPDATED = False

def __init__(self, request: HttpRequest):
"""

Expand Down Expand Up @@ -119,22 +121,31 @@ def authenticate(self, token: dict) -> AbstractBaseUser:
**self._map_attributes_to_user(**attributes),
)

if not AuthHandler.GROUPS_UPDATED:
role_mappings = settings.AZURE_AUTH.get("ROLES")
for group_name in role_mappings.values():
Group.objects.get_or_create(name=group_name)
AuthHandler.GROUPS_UPDATED = True

# Syncing azure token claim roles with django user groups
# A role mapping in the AZURE_AUTH settings is expected.
role_mappings = settings.AZURE_AUTH.get("ROLES")
azure_token_roles = token.get("id_token_claims", {}).get("roles", None)
if role_mappings: # pragma: no branch
for role, group_name in role_mappings.items():
# all groups are created by default if they not exist
django_group = Group.objects.get_or_create(name=group_name)[0]

if azure_token_roles and role in azure_token_roles:
# Add user with permissions to the corresponding django group
user.groups.add(django_group)
else:
# No permission so check if user is in group and remove
if user.groups.filter(name=group_name).exists():
user.groups.remove(django_group)
token_groups = [
name for (id, name) in role_mappings.items() if id in azure_token_roles
]
current_groups = list(user.groups.values_list("name", flat=True))

if to_add := [item for item in token_groups if item not in current_groups]:
user.groups.add(*Group.objects.filter(name__in=to_add))

if to_remove := [
item
for item in current_groups
if item in role_mappings.values() and item not in token_groups
]:
user.groups.remove(*Group.objects.filter(name__in=to_remove))

return user

Expand Down
6 changes: 6 additions & 0 deletions azure_auth/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import pytest
from django.contrib.auth import get_user_model
from mixer.backend.django import mixer
from azure_auth.handlers import AuthHandler

UserModel = get_user_model()

Expand All @@ -19,6 +20,11 @@ def user(request):
return _user


@pytest.fixture(scope="function", autouse=True)
def clean_groups():
AuthHandler.GROUPS_UPDATED = False


@pytest.fixture(scope="function")
def auth_flow(request):
_auth_flow = {
Expand Down
92 changes: 46 additions & 46 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.