Makina Blog
Mettre en place un SSO sur l’admin Django
Lorsque l’on relie son site Django à un SSO, on a souvent le contrôle sur l’authentification des vues Django que l’on développe mais pour certains modules pris sur étagère il faut réaliser des adaptations. Par exemple pour la documentation swagger d’une API django-rest-framework il y a des adaptations à faire (j’explique comment faire dans cet article). C’est aussi le cas du site d’administration de Django. Dans cet article, je vais donc vous montrer comment mettre en place l’authentification par SSO sur l’admin avec la bibliothèque django_pyoidc.
Voici la page que nous allons implémenter :
Plan d’action
Tout d’abord, vous devez installer et paramétrer la bibliothèque django_pyoidc. Ce point n’est pas couvert dans cet article, mais un tutoriel (en Anglais) existe sur le site de la documentation. Pour le reste du tutoriel nous allons utiliser un provider nommé « sso ».
Pour intégrer un SSO sur le site d’admin il faut deux choses :
- des vues Django qui implémentent les fonctionnalités d’OIDC et qui authentifient les utilisateurs dans le backend d’authentification du site Django. C’est ce qui est fourni par django_pyoidc.
- une page de connexion pour le site d’admin qui redirige vers la page de login OIDC. C’est sur ce point que nous allons nous concentrer dans cet article.
Pour modifier la page de connexion de l’admin Django il y a deux options :
- déclarer un template dont le chemin écrase celui fournir par l’application d’admin.
- déclarer un site d’admin custom qui utilise un autre template que celui par défaut.
Nous allons partir sur la deuxième option qui offrira plus de stabilité dans le temps : si le framework change le chemin du template de login, notre implémentation continuera de fonctionner. De plus à la lecture du code, la customisation du site d’admin sera explicite.
La démarche générale consiste à :
- déclarer un AdminSite qui référence le template
- déclarer un AdminConfig qui référence l’AdminSite
- modifier le setting INSTALLED_APPS pour référencer l’AdminConfig custom au lieu de django.contrib.auth
Mais tout d’abord, créons le template de la nouvelle page de connexion !
1-Création du template
Tout d’abord, nous allons créer un template custom qui remplace le formulaire de connexion de l’admin par un bouton qui redirige vers notre vue de connexion OIDC.
Il est important que l’action de connexion soit déclenché par le clic sur un bouton (par opposition à une connexion automatique) car il se peut que l’utilisateur n’ait pas la permission de consulter le site d’admin. Une redirection automatique vers le SSO entraînerait alors une boucle de redirection.
Créez le template suivant dans le dossier my_project/templates/my_project/login.html :
{% extends "admin/base_site.html" %}
{% load i18n static %}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" href="{% static "admin/css/login.css" %}">
{{ form.media }}
{% endblock %}
{% block bodyclass %}{{ block.super }} login{% endblock %}
{% block usertools %}{% endblock %}
{% block nav-global %}{% endblock %}
{% block nav-sidebar %}{% endblock %}
{% block content_title %}{% endblock %}
{% block nav-breadcrumbs %}{% endblock %}
{% block content %}
{% if form.errors and not form.non_field_errors %}
<p class="errornote">
{% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %}
</p>
{% endif %}
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
<p class="errornote">
{{ error }}
</p>
{% endfor %}
{% endif %}
<div id="content-main">
{% if user.is_authenticated %}
<p class="errornote">
{% blocktranslate trimmed %}
You are logged in as {{ username }} but you are not allowed to access this page. Would you like to logout to try with an other user account ?
{% endblocktranslate %}
<form action="{% url "sso-logout" %}" method="GET" id="login-form">{% csrf_token %}
<div class="submit-row">
<input type="submit" value="{% translate "Logout" %}">
</div>
</form>
</p>
{% else %}
<form action="{% url "sso-login" %}" method="GET" id="login-form">{% csrf_token %}
<div class="submit-row">
<input type="submit" value="{% translate "Login" %}">
</div>
</form>
{% endif %}
</div>
{% endblock %}
Ce template étend le template de base du site d’administration pour re-utiliser les éléments de style. Si l’utilisateur est authentifié et se trouve sur cette page, cela veut dire qu’il n’a pas les droits d’accès à l’admin et on affiche un bouton de déconnexion.
La vue de login de django_pyoidc est nommée « sso-login » sur cet exemple, et la vue de logout se nomme « sso-logout ».
Maintenant que nous avons un template, il faut le brancher sur le site d’administration.
Mise en place d’un site d’administration custom
Créez un fichier sites.py à côté de vos settings. Collez-y le contenu suivant :
# sites.py
from django.contrib.admin import AdminSite
class OIDCLoginAdminSite(AdminSite):
login_template = "my_project/login.html"
site_header = "Administration Site"
site = OIDCLoginAdminSite(name="my-project-admin")
# Il nous faut un objet Python "callable"
def get_site():
return site
L’élément le plus important est l’attribut login_template qui pointe vers le template que nous venons de créer.
Ensuite, créez un deuxième fichier admin_config à côté de vos settings pour déclarer une configuration d’admin custom qui référence ce site d’admin custom :
# admin_config.py
from django.contrib.admin.apps import AdminConfig
class CustomAdmin(AdminConfig):
default_site = "my_project.sites.get_site"
Vous avez donc 3 fichiers les uns à côté des autres, dans votre dossier projet :
- settings.py
- sites.py
- admin_config.py
Pour finaliser la mise en place il ne reste plus qu’à importer l’application d’admin depuis votre config custom plutôt que django.contrib.auth :
# settings.py
INSTALLED_APPS = [
# La ligne ci-dessus remplace 'django.contrib.auth'
"my_project.admin_config.CustomAdmin",
]
Et voilà, vous avez fini ! 🎉
Formations associées
Formations Django
Formation Django initiation
Aucune session de formation n'est prévue pour le moment.
Pour plus d'informations, n'hésitez pas à nous contacter.
Voir la Formation Django initiationFormations Django
Formation Django avancé
Aucune session de formation n'est prévue pour le moment.
Pour plus d'informations, n'hésitez pas à nous contacter.
Voir la Formation Django avancéFormations Django
Formation Django REST Framework
Aucune session de formation n'est prévue pour le moment.
Pour plus d'informations, n'hésitez pas à nous contacter.
Voir la Formation Django REST FrameworkActualités en lien
Configurer swagger avec un SSO sur une API Django
Django
22/07/2026
Bibliothèque d’authentification OpenID Connect Django
Django
08/04/2025
Administrer des comptes Keycloak depuis une application Python/Django
Django
18/11/2021
Dans cet article, nous allons créer une application Python/Django qui agira en tant que maître sur Keycloak afin de pouvoir ajouter facilement des comportements personnalisés à Keycloak.