from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.contrib.auth.backends import ModelBackend from django.conf import settings from django.db import transaction class TESTOAuth2Backend(ModelBackend): def authenticate(self, id=None, username=None, **profile): if id is None or username is None: return None user, _ = get_user_model().objects.get_or_create( pk=id, username=username ) if getattr(settings, 'TEST_OAUTH_CREATE_GROUPS', False): self._do_create_groups(user, profile.get('groups', [])) return user def get_user(self, user_id): UserModel = get_user_model() try: return UserModel.objects.get(pk=user_id) except UserModel.DoesNotExist: return None @transaction.atomic def _do_create_groups(self, user, groups): user.groups.clear() for g in groups: group, _ = Group.objects.get_or_create( id=g['id'], name=g['name'] ) user.groups.add(group) # Adding carveout for Server Admin group if g['name'] == "Server Admin": user.is_staff = True user.save()