* initial Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add user type Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add external users Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add ui, add more logic, add public JWT validation key Signed-off-by: Jens Langhammer <jens@goauthentik.io> * revert to not use install_id as session jwt signing key Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix more Signed-off-by: Jens Langhammer <jens@goauthentik.io> * switch to PKI Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add more licensing stuff Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add install ID to form Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix bugs Signed-off-by: Jens Langhammer <jens@goauthentik.io> * start adding tests Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fixes Signed-off-by: Jens Langhammer <jens@goauthentik.io> * use x5c correctly Signed-off-by: Jens Langhammer <jens@goauthentik.io> * license checks Signed-off-by: Jens Langhammer <jens@goauthentik.io> * use production CA Signed-off-by: Jens Langhammer <jens@goauthentik.io> * more Signed-off-by: Jens Langhammer <jens@goauthentik.io> * more UI stuff Signed-off-by: Jens Langhammer <jens@goauthentik.io> * rename to summary Signed-off-by: Jens Langhammer <jens@goauthentik.io> * update locale, improve ui Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add direct button Signed-off-by: Jens Langhammer <jens@goauthentik.io> * update link Signed-off-by: Jens Langhammer <jens@goauthentik.io> * format and such Signed-off-by: Jens Langhammer <jens@goauthentik.io> * remove old attributes from ldap Signed-off-by: Jens Langhammer <jens@goauthentik.io> * remove is_enterprise_licensed Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix admin interface styling issue Signed-off-by: Jens Langhammer <jens@goauthentik.io> * Update authentik/core/models.py Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com> Signed-off-by: Jens L. <jens@beryju.org> * fix default case Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Jens Langhammer <jens@goauthentik.io> Signed-off-by: Jens L. <jens@beryju.org> Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
105 lines
3.3 KiB
Python
105 lines
3.3 KiB
Python
"""SCIM Provider models"""
|
|
from django.db import models
|
|
from django.db.models import QuerySet
|
|
from django.utils.translation import gettext_lazy as _
|
|
from guardian.shortcuts import get_anonymous_user
|
|
from rest_framework.serializers import Serializer
|
|
|
|
from authentik.core.models import BackchannelProvider, Group, PropertyMapping, User, UserTypes
|
|
|
|
|
|
class SCIMProvider(BackchannelProvider):
|
|
"""SCIM 2.0 provider to create users and groups in external applications"""
|
|
|
|
exclude_users_service_account = models.BooleanField(default=False)
|
|
|
|
filter_group = models.ForeignKey(
|
|
"authentik_core.group", on_delete=models.SET_DEFAULT, default=None, null=True
|
|
)
|
|
|
|
url = models.TextField(help_text=_("Base URL to SCIM requests, usually ends in /v2"))
|
|
token = models.TextField(help_text=_("Authentication token"))
|
|
|
|
property_mappings_group = models.ManyToManyField(
|
|
PropertyMapping,
|
|
default=None,
|
|
blank=True,
|
|
help_text=_("Property mappings used for group creation/updating."),
|
|
)
|
|
|
|
def get_user_qs(self) -> QuerySet[User]:
|
|
"""Get queryset of all users with consistent ordering
|
|
according to the provider's settings"""
|
|
base = User.objects.all().exclude(pk=get_anonymous_user().pk)
|
|
if self.exclude_users_service_account:
|
|
base = base.exclude(type=UserTypes.SERVICE_ACCOUNT).exclude(
|
|
type=UserTypes.INTERNAL_SERVICE_ACCOUNT
|
|
)
|
|
if self.filter_group:
|
|
base = base.filter(ak_groups__in=[self.filter_group])
|
|
return base.order_by("pk")
|
|
|
|
def get_group_qs(self) -> QuerySet[Group]:
|
|
"""Get queryset of all groups with consistent ordering"""
|
|
return Group.objects.all().order_by("pk")
|
|
|
|
@property
|
|
def component(self) -> str:
|
|
return "ak-provider-scim-form"
|
|
|
|
@property
|
|
def serializer(self) -> type[Serializer]:
|
|
from authentik.providers.scim.api.providers import SCIMProviderSerializer
|
|
|
|
return SCIMProviderSerializer
|
|
|
|
def __str__(self):
|
|
return f"SCIM Provider {self.name}"
|
|
|
|
class Meta:
|
|
verbose_name = _("SCIM Provider")
|
|
verbose_name_plural = _("SCIM Providers")
|
|
|
|
|
|
class SCIMMapping(PropertyMapping):
|
|
"""Map authentik data to outgoing SCIM requests"""
|
|
|
|
@property
|
|
def component(self) -> str:
|
|
return "ak-property-mapping-scim-form"
|
|
|
|
@property
|
|
def serializer(self) -> type[Serializer]:
|
|
from authentik.providers.scim.api.property_mapping import SCIMMappingSerializer
|
|
|
|
return SCIMMappingSerializer
|
|
|
|
def __str__(self):
|
|
return f"SCIM Mapping {self.name}"
|
|
|
|
class Meta:
|
|
verbose_name = _("SCIM Mapping")
|
|
verbose_name_plural = _("SCIM Mappings")
|
|
|
|
|
|
class SCIMUser(models.Model):
|
|
"""Mapping of a user and provider to a SCIM user ID"""
|
|
|
|
id = models.TextField(primary_key=True)
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
|
provider = models.ForeignKey(SCIMProvider, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
unique_together = (("id", "user", "provider"),)
|
|
|
|
|
|
class SCIMGroup(models.Model):
|
|
"""Mapping of a group and provider to a SCIM user ID"""
|
|
|
|
id = models.TextField(primary_key=True)
|
|
group = models.ForeignKey(Group, on_delete=models.CASCADE)
|
|
provider = models.ForeignKey(SCIMProvider, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
unique_together = (("id", "group", "provider"),)
|