Makina Blog

Le blog Makina-corpus

Mettre en place un SSO sur l’ad­min Django


Comment mettre un place un SSO sur le site d’ad­mi­nis­tra­tion Django ? La réponse avec la biblio­thèque django_pyoidc.

Lorsque l’on relie son site Django à un SSO, on a souvent le contrôle sur l’au­then­ti­fi­ca­tion des vues Django que l’on déve­loppe mais pour certains modules pris sur étagère il faut réali­ser des adap­ta­tions. Par exemple pour la docu­men­ta­tion swag­ger d’une API django-rest-frame­work il y a des adap­ta­tions à faire (j’ex­plique comment faire dans cet article). C’est aussi le cas du site d’ad­mi­nis­tra­tion de Django. Dans cet article, je vais donc vous montrer comment mettre en place l’au­then­ti­fi­ca­tion par SSO sur l’ad­min avec la biblio­thèque django_pyoidc.

Voici la page que nous allons implé­men­ter :

Page d'admin django avec un bouton pour se connecter sur un SSO

Plan d’ac­tion

Tout d’abord, vous devez instal­ler et para­mé­trer la biblio­thèque django_pyoidc. Ce point n’est pas couvert dans cet article, mais un tuto­riel (en Anglais) existe sur le site de la docu­men­ta­tion. Pour le reste du tuto­riel nous allons utili­ser un provi­der nommé « sso ».

Pour inté­grer un SSO sur le site d’ad­min il faut deux choses :

  • des vues Django qui implé­mentent les fonc­tion­na­li­tés d’OIDC et qui authen­ti­fient les utili­sa­teurs dans le backend d’au­then­ti­fi­ca­tion du site Django. C’est ce qui est fourni par django_pyoidc.
  • une page de connexion pour le site d’ad­min qui redi­rige vers la page de login OIDC. C’est sur ce point que nous allons nous concen­trer dans cet article.

Pour modi­fier la page de connexion de l’ad­min Django il y a deux options :

  1. décla­rer un template dont le chemin écrase celui four­nir par l’ap­pli­ca­tion d’ad­min.
  2. décla­rer un site d’ad­min custom qui utilise un autre template que celui par défaut.

Nous allons partir sur la deuxième option qui offrira plus de stabi­lité dans le temps : si le frame­work change le chemin du template de login, notre implé­men­ta­tion conti­nuera de fonc­tion­ner. De plus à la lecture du code, la custo­mi­sa­tion du site d’ad­min sera expli­cite.

La démarche géné­rale consiste à :

  1. décla­rer un Admin­Site qui réfé­rence le template
  2. décla­rer un Admin­Con­fig qui réfé­rence l’Ad­min­Site
  3. modi­fier le setting INSTAL­LED_APPS pour réfé­ren­cer l’Ad­min­Con­fig custom au lieu de django.contrib.auth
Processus de customisation du template de login

Mais tout d’abord, créons le template de la nouvelle page de connexion !

1-Créa­tion du template

Tout d’abord, nous allons créer un template custom qui remplace le formu­laire de connexion de l’ad­min par un bouton qui redi­rige vers notre vue de connexion OIDC.

Il est impor­tant que l’ac­tion de connexion soit déclen­ché par le clic sur un bouton (par oppo­si­tion à une connexion auto­ma­tique) car il se peut que l’uti­li­sa­teur n’ait pas la permis­sion de consul­ter le site d’ad­min. Une redi­rec­tion auto­ma­tique vers le SSO entraî­ne­rait alors une boucle de redi­rec­tion. 

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’ad­mi­nis­tra­tion pour re-utili­ser les éléments de style. Si l’uti­li­sa­teur est authen­ti­fié et se trouve sur cette page, cela veut dire qu’il n’a pas les droits d’ac­cès à l’ad­min et on affiche un bouton de décon­nexion.

La vue de login de django_pyoidc est nommée « sso-login » sur cet exemple, et la vue de logout se nomme « sso-logout ».

Main­te­nant que nous avons un template, il faut le bran­cher sur le site d’ad­mi­nis­tra­tion.

Mise en place d’un site d’ad­mi­nis­tra­tion 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 impor­tant est l’at­tri­but 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écla­rer une confi­gu­ra­tion d’ad­min custom qui réfé­rence ce site d’ad­min 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 fina­li­ser la mise en place il ne reste plus qu’à impor­ter l’ap­pli­ca­tion d’ad­min 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 initiation

Formations 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 Framework

Actualités en lien

Confi­gu­rer swag­ger avec un SSO sur une API Django

22/07/2026

Confi­gu­rer swag­ger avec une authen­ti­fi­ca­tion single-sign-on (SSO) sur votre API afin de pouvoir la tester avec des jetons OpenID Connect (OIDC).
Voir l'article

Biblio­thèque d’au­then­ti­fi­ca­tion OpenID Connect Django

08/04/2025

Nous publions en logi­ciel libre notre inté­gra­tion du proto­cole OpenID Connect (OIDC) avec Django : django-pyoidc.
Voir l'article
Image
Encart librairie Django-pyoidc

Administrer des comptes Keycloak depuis une application Python/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.

Voir l'article
Image
Django Python Keycloak

Inscription à la newsletter

Nous vous avons convaincus