Skip to content
Snippets Groups Projects
authentication_backends.py 1.98 KiB
Newer Older
from mozilla_django_oidc.auth import OIDCAuthenticationBackend
import logging
from lofar.sas.tmss.tmss.tmssapp.models import ProjectRole

logger = logging.getLogger(__name__)

class TMSSOIDCAuthenticationBackend(OIDCAuthenticationBackend):
    """
    A custom OIDCAuthenticationBackend, that allows us to perform extra actions when a user gets authenticated,
    most importantly we can assign the user's system and project roles according to the claims that we get from the
    identity provider.
    """

    def _set_user_project_roles_from_claims(self, user, claims):
        project_roles = []
        prefix = 'urn:mace:astron.nl:science:group:lofar:project:'
        for entitlement in claims.get('eduperson_entitlement', []):
            try:
                if entitlement.startswith(prefix):
                    project, role = entitlement.replace(prefix, '').split(':')
                    role = role.replace('role=', '')
                    if ProjectRole.objects.filter(value=role).count() > 0:
                        project_roles.append({'project': project, 'role': role})
                    else:
                        logger.error('could not parse entitlement=%s because no project role exists that matches the entitlement role=%s' % (entitlement, role))
            except Exception as e:
                logger.error('could not parse entitlement=%s because of exception=%s' % (entitlement, e))
        user.project_roles = project_roles
        logger.info("### assigned project_roles=%s to user=%s" % (project_roles, user))
        user.save()

    def create_user(self, claims):
        user = super(TMSSOIDCAuthenticationBackend, self).create_user(claims)
        logger.info('### create user=%s claims=%s' % (user, claims))
        self._set_user_project_roles_from_claims(user, claims)
        return user

    def update_user(self, user, claims):
        logger.info('### update user=%s claims=%s' % (user, claims))
        self._set_user_project_roles_from_claims(user, claims)
        return user