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 in [
18            SCIMAuthenticationMode.OAUTH_SILENT,
19            SCIMAuthenticationMode.OAUTH_INTERACTIVE,
20        ]:
21            user, user_created = User.objects.update_or_create(
22                username=identifier,
23                defaults={
24                    "name": f"SCIM Provider {instance.name} Service-Account",
25                    "type": UserTypes.INTERNAL_SERVICE_ACCOUNT,
26                    "path": USER_PATH_PROVIDERS_SCIM,
27                },
28            )
29            if created or user_created:
30                instance.auth_oauth_user = user
31                instance.save()
32        elif instance.auth_mode == SCIMAuthenticationMode.TOKEN:
33            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 in [
19            SCIMAuthenticationMode.OAUTH_SILENT,
20            SCIMAuthenticationMode.OAUTH_INTERACTIVE,
21        ]:
22            user, user_created = User.objects.update_or_create(
23                username=identifier,
24                defaults={
25                    "name": f"SCIM Provider {instance.name} Service-Account",
26                    "type": UserTypes.INTERNAL_SERVICE_ACCOUNT,
27                    "path": USER_PATH_PROVIDERS_SCIM,
28                },
29            )
30            if created or user_created:
31                instance.auth_oauth_user = user
32                instance.save()
33        elif instance.auth_mode == SCIMAuthenticationMode.TOKEN:
34            User.objects.filter(username=identifier).delete()

Create service account before provider is saved