authentik.sources.scim.signals

 1from django.db.models import Model
 2from django.db.models.signals import post_delete, post_save
 3from django.dispatch import receiver
 4
 5from authentik.core.models import USER_PATH_SYSTEM_PREFIX, Token, TokenIntents, User, UserTypes
 6from authentik.events.middleware import audit_ignore
 7from authentik.sources.scim.models import SCIMSource
 8
 9USER_PATH_SOURCE_SCIM = USER_PATH_SYSTEM_PREFIX + "/sources/scim"
10
11
12@receiver(post_save, sender=SCIMSource)
13def scim_source_post_save(sender: type[Model], instance: SCIMSource, created: bool, **_):
14    """Create service account before source is saved"""
15    identifier = instance.service_account_identifier
16    user, _ = User.objects.update_or_create(
17        username=identifier,
18        defaults={
19            "name": f"SCIM Source {instance.name} Service-Account",
20            "type": UserTypes.INTERNAL_SERVICE_ACCOUNT,
21            "path": USER_PATH_SOURCE_SCIM,
22        },
23    )
24    token, token_created = Token.objects.update_or_create(
25        identifier=identifier,
26        defaults={
27            "user": user,
28            "intent": TokenIntents.INTENT_API,
29            "expiring": False,
30            "managed": f"goauthentik.io/sources/scim/{instance.pk}",
31        },
32    )
33    if created or token_created:
34        with audit_ignore():
35            instance.token = token
36            instance.save()
37
38
39@receiver(post_delete, sender=SCIMSource)
40def scim_source_post_delete(sender: type[Model], instance: SCIMSource, **_):
41    """Delete SCIM Source service account after deleting source"""
42    User.objects.filter(
43        username=instance.service_account_identifier, type=UserTypes.INTERNAL_SERVICE_ACCOUNT
44    ).delete()
USER_PATH_SOURCE_SCIM = 'goauthentik.io/sources/scim'
@receiver(post_save, sender=SCIMSource)
def scim_source_post_save( sender: type[django.db.models.base.Model], instance: authentik.sources.scim.models.SCIMSource, created: bool, **_):
13@receiver(post_save, sender=SCIMSource)
14def scim_source_post_save(sender: type[Model], instance: SCIMSource, created: bool, **_):
15    """Create service account before source is saved"""
16    identifier = instance.service_account_identifier
17    user, _ = User.objects.update_or_create(
18        username=identifier,
19        defaults={
20            "name": f"SCIM Source {instance.name} Service-Account",
21            "type": UserTypes.INTERNAL_SERVICE_ACCOUNT,
22            "path": USER_PATH_SOURCE_SCIM,
23        },
24    )
25    token, token_created = Token.objects.update_or_create(
26        identifier=identifier,
27        defaults={
28            "user": user,
29            "intent": TokenIntents.INTENT_API,
30            "expiring": False,
31            "managed": f"goauthentik.io/sources/scim/{instance.pk}",
32        },
33    )
34    if created or token_created:
35        with audit_ignore():
36            instance.token = token
37            instance.save()

Create service account before source is saved

@receiver(post_delete, sender=SCIMSource)
def scim_source_post_delete( sender: type[django.db.models.base.Model], instance: authentik.sources.scim.models.SCIMSource, **_):
40@receiver(post_delete, sender=SCIMSource)
41def scim_source_post_delete(sender: type[Model], instance: SCIMSource, **_):
42    """Delete SCIM Source service account after deleting source"""
43    User.objects.filter(
44        username=instance.service_account_identifier, type=UserTypes.INTERNAL_SERVICE_ACCOUNT
45    ).delete()

Delete SCIM Source service account after deleting source