authentik.enterprise.providers.scim.signals

 1from django.db.models import Model
 2from django.db.models.signals import post_save
 3from django.dispatch import receiver
 4
 5from authentik.core.models import USER_PATH_SYSTEM_PREFIX, User, UserTypes
 6from authentik.events.middleware import audit_ignore
 7from authentik.providers.scim.models import SCIMAuthenticationMode, SCIMProvider
 8
 9USER_PATH_PROVIDERS_SCIM = USER_PATH_SYSTEM_PREFIX + "/providers/scim"
10
11
12@receiver(post_save, sender=SCIMProvider)
13def scim_provider_post_save(sender: type[Model], instance: SCIMProvider, created: bool, **__):
14    """Create service account before provider is saved"""
15    identifier = f"ak-providers-scim-{instance.pk}"
16    with audit_ignore():
17        if instance.auth_mode == SCIMAuthenticationMode.OAUTH:
18            user, user_created = User.objects.update_or_create(
19                username=identifier,
20                defaults={
21                    "name": f"SCIM Provider {instance.name} Service-Account",
22                    "type": UserTypes.INTERNAL_SERVICE_ACCOUNT,
23                    "path": USER_PATH_PROVIDERS_SCIM,
24                },
25            )
26            if created or user_created:
27                instance.auth_oauth_user = user
28                instance.save()
29        elif instance.auth_mode == SCIMAuthenticationMode.TOKEN:
30            User.objects.filter(username=identifier).delete()
USER_PATH_PROVIDERS_SCIM = 'goauthentik.io/providers/scim'
@receiver(post_save, sender=SCIMProvider)
def scim_provider_post_save( sender: type[django.db.models.base.Model], instance: authentik.providers.scim.models.SCIMProvider, created: bool, **__):
13@receiver(post_save, sender=SCIMProvider)
14def scim_provider_post_save(sender: type[Model], instance: SCIMProvider, created: bool, **__):
15    """Create service account before provider is saved"""
16    identifier = f"ak-providers-scim-{instance.pk}"
17    with audit_ignore():
18        if instance.auth_mode == SCIMAuthenticationMode.OAUTH:
19            user, user_created = User.objects.update_or_create(
20                username=identifier,
21                defaults={
22                    "name": f"SCIM Provider {instance.name} Service-Account",
23                    "type": UserTypes.INTERNAL_SERVICE_ACCOUNT,
24                    "path": USER_PATH_PROVIDERS_SCIM,
25                },
26            )
27            if created or user_created:
28                instance.auth_oauth_user = user
29                instance.save()
30        elif instance.auth_mode == SCIMAuthenticationMode.TOKEN:
31            User.objects.filter(username=identifier).delete()

Create service account before provider is saved