{"title":"Comment authentifier avec REMOTE_USER","version":"6.1","locale":"fr","docname":"howto/auth-remote-user","url":"/fr/6.1/howto/auth-remote-user/","canonical":"https://djangodocs.dev/fr/6.1/howto/auth-remote-user/","summary":"Ce document présente la procédure pour utiliser des sources d’authentification externes dans vos applications Django.","html":"<h1>Comment authentifier avec <code class=\"docutils literal notranslate\">REMOTE_USER</code><a class=\"heading-anchor\" href=\"#how-to-authenticate-using-remote-user\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce document présente la procédure pour utiliser des sources d’authentification externes dans vos applications Django. Ce type de solution d’authentification est typique des sites intranet, avec des solutions d’authentification centralisée comme IIS et Integrated Windows Authentication ou Apache et <a class=\"reference external\" href=\"https://httpd.apache.org/docs/current/mod/mod_authnz_ldap.html\">mod_authnz_ldap</a>, <a class=\"reference external\" href=\"https://www.apereo.org/projects/cas\">CAS</a>, <a class=\"reference external\" href=\"https://uit.stanford.edu/service/authentication\">WebAuth</a>, <a class=\"reference external\" href=\"https://sourceforge.net/projects/mod-auth-sspi\">mod_auth_sspi</a>, etc.</p>\n<p>Lorsque le serveur Web se charge de l’authentification, il fournit généralement la personne authentifiée dans <code class=\"docutils literal notranslate\">REMOTE_USER</code>. Dans Django, cette valeur est accessible dans <a class=\"reference internal\" href=\"/fr/6.1/ref/request-response/#django.http.HttpRequest.META\" title=\"django.http.HttpRequest.META\"><code class=\"xref py py-attr docutils literal notranslate\">request.META</code></a> (comme <code class=\"docutils literal notranslate\">REMOTE_USER</code> lorsqu’elle est fournie par variable d’environnement avec WSGI, ou <code class=\"docutils literal notranslate\">HTTP_REMOTE_USER</code> lorsqu’elle est fournie par un en-tête HTTP avec ASGI). Django peut être configuré pour exploiter la valeur <code class=\"docutils literal notranslate\">REMOTE_USER</code> en utilisant les classes <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code>, <code class=\"docutils literal notranslate\">PersistentRemoteUserMiddleware</code> et <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\">RemoteUserBackend</code></a> qui se trouvent dans <a class=\"reference internal\" href=\"/fr/6.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a>.</p>\n<section id=\"configuration\">\n<h2>Configuration<a class=\"heading-anchor\" href=\"#configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vous devez tout d’abord ajouter <a class=\"reference internal\" href=\"/fr/6.1/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.auth.middleware.RemoteUserMiddleware</code></a> au réglage <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> <strong>après</strong> la valeur <a class=\"reference internal\" href=\"/fr/6.1/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.auth.middleware.AuthenticationMiddleware</code></a> :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>MIDDLEWARE <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.AuthenticationMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.RemoteUserMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Puis, vous devez remplacez <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/auth/#django.contrib.auth.backends.ModelBackend\" title=\"django.contrib.auth.backends.ModelBackend\"><code class=\"xref py py-class docutils literal notranslate\">ModelBackend</code></a> par <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\">RemoteUserBackend</code></a> dans le réglage <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\">AUTHENTICATION_BACKENDS</code></a> :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>AUTHENTICATION_BACKENDS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.contrib.auth.backends.RemoteUserBackend&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Avec cette configuration, <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> va détecter le nom d’utilisateur dans <code class=\"docutils literal notranslate\">request.META['REMOTE_USER']</code> (ou <code class=\"docutils literal notranslate\">request.META['HTTP_REMOTE_USER']</code> avec ASGI) et va authentifier et connecter automatiquement cet utilisateur à l’aide de <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\">RemoteUserBackend</code></a>.</p>\n<p>Soyez conscient que cette configuration particulière désactive l’authentification avec le <code class=\"docutils literal notranslate\">ModelBackend</code> par défaut. Cela signifie que si la valeur de <code class=\"docutils literal notranslate\">REMOTE_USER</code> n’est pas configurée, l’utilisateur ne parviendra pas à se connecter, même en utilisant l’interface d’administration de Django. Ajouter <code class=\"docutils literal notranslate\">'django.contrib.auth.backends.ModelBackend'</code> à la liste des <code class=\"docutils literal notranslate\">AUTHENTICATION_BACKENDS</code> utilisera <code class=\"docutils literal notranslate\">ModelBackend</code> comme solution de repli si <code class=\"docutils literal notranslate\">REMOTE_USER</code> est absent, ce qui permettra de résoudre ces problèmes.</p>\n<p>La gestion des utilisateurs de Django, tels que les vue de <code class=\"docutils literal notranslate\">contrib.admin</code> et la commande de gestion <a class=\"reference internal\" href=\"/fr/6.1/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\">createsuperuser</code></a>, ne s’intègrent pas avec des utilisateurs distants. Ces interfaces travaillent avec les utilisateurs stockés dans la base de données indépendamment de `` AUTHENTICATION_BACKENDS``.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Comme <code class=\"docutils literal notranslate\">RemoteUserBackend</code> hérite de <code class=\"docutils literal notranslate\">ModelBackend</code>, le contrôle des permissions implémenté dans <code class=\"docutils literal notranslate\">ModelBackend</code> est toujours disponible.</p>\n<p>Les utilisateurs avec <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">is_active=False</code></a> ne seront pas autorisés à s’authentifier. Utilisez <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/auth/#django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\" title=\"django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\">AllowAllUsersRemoteUserBackend</code></a> si vous voulez les autoriser à se connecter.</p>\n</aside>\n<p>Si votre mécanisme d’authentification utilise un en-tête HTTP personnalisé à la place de <code class=\"docutils literal notranslate\">REMOTE_USER</code>, vous pouvez créer une sous-classe de <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> et définir l’attribut <code class=\"docutils literal notranslate\">header</code> à la clé de <code class=\"docutils literal notranslate\">request.META</code> désirée. Par exemple :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">monsite/middleware.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code> <span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.middleware</span> <span class=\"kn\">import</span> RemoteUserMiddleware\n\n\n <span class=\"k\">class</span> <span class=\"nc\">CustomHeaderRemoteUserMiddleware</span><span class=\"p\">(</span>RemoteUserMiddleware<span class=\"p\">):</span>\n     header <span class=\"o\">=</span> <span class=\"s2\">&quot;HTTP_AUTHUSER&quot;</span>\n</code></pre></figure>\n<p>Cet intergiciel personnalisé est alors utilisé dans le réglage <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> à la place de <a class=\"reference internal\" href=\"/fr/6.1/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.auth.middleware.RemoteUserMiddleware</code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>MIDDLEWARE <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.AuthenticationMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;mysite.middleware.CustomHeaderRemoteUserMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p><code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> ne doit pas être déployé dans des configurations où un client peut définir l’en-tête. Vous devez vous assurer que votre serveur web ou le proxy inversé définit ou enlève toujours cet en-tête sur la base de contrôles d’authentification appropriés, pour empêcher dans tous les cas un utilisateur de soumettre une valeur d’en-tête fabriquée.</p>\n<p>Comme les en-têtes HTTP <code class=\"docutils literal notranslate\">X-Auth-User</code> et <code class=\"docutils literal notranslate\">X-Auth_User</code> (par exemple) sont tous deux normalisés en <code class=\"docutils literal notranslate\">HTTP_X_AUTH_USER</code> dans <code class=\"docutils literal notranslate\">request.META</code>, vous devez aussi contrôler que votre serveur web n’autorise pas d’en-tête fabriqué qui utiliserait des soulignements à la place des tirets.</p>\n<p>Avec WSGI, cet avertissement ne s’applique pas à <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> dans sa configuration par défaut avec <code class=\"docutils literal notranslate\">header = &quot;REMOTE_USER&quot;</code>, car une clé qui ne commence pas par <code class=\"docutils literal notranslate\">HTTP_</code> dans <code class=\"docutils literal notranslate\">request.META</code> ne peut être définie que par le serveur WSGI, et pas directement à partir d’un en-tête de requête HTTP.</p>\n<p>Cet avertissement s’applique avec ASGI dans toutes les configurations, car il n’existe pas d’équivalent à la capacité des serveurs WSGI de placer une valeur fiable dans l’environnement. Les déploiements ASGI <em>doivent</em> utiliser un proxy inversé tel que présenté ci-dessus lors de l’utilisation de cet intergiciel.</p>\n</aside>\n<p>Si vous avez besoin de plus de maîtrise, vous pouvez créer votre propre moteur d’authentification héritant de <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\">RemoteUserBackend</code></a> et surcharger un ou plusieurs de ses attributs et méthodes.</p>\n</section>\n<section id=\"using-remote-user-on-login-pages-only\">\n<span id=\"persistent-remote-user-middleware-howto\"></span><h2>Utilisation de <code class=\"docutils literal notranslate\">REMOTE_USER</code> uniquement pour les pages de connexion<a class=\"heading-anchor\" href=\"#using-remote-user-on-login-pages-only\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L’intergiciel d’authentification <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> part du principe que l’en-tête de requête HTTP <code class=\"docutils literal notranslate\">REMOTE_USER</code> est présent pour toutes les requêtes authentifiées. C’est en général le cas lorsqu’un mécanisme du genre Basic HTTP Auth avec <code class=\"docutils literal notranslate\">htpasswd</code> est utilisé, mais avec des méthodes d’authentification comme Negotiate (GSSAPI/Kerberos) ou autres méthodes gourmandes en ressources, l’authentification au niveau du serveur HTTP frontal n’est habituellement configurée que pour une ou quelques URL de connexion ; après une authentification réussie, l’application est censé maintenir elle-même la session authentifiée.</p>\n<p><a class=\"reference internal\" href=\"/fr/6.1/ref/middleware/#django.contrib.auth.middleware.PersistentRemoteUserMiddleware\" title=\"django.contrib.auth.middleware.PersistentRemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">PersistentRemoteUserMiddleware</code></a> prend en charge ce cas d’utilisation. Il maintient la session authentifiée jusqu’à une déconnexion explicite par l’utilisateur. Cette classe peut être utilisée en remplacement de <a class=\"reference internal\" href=\"/fr/6.1/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">RemoteUserMiddleware</code></a> dans la documentation ci-dessus sans autre modification.</p>\n</section>","rootId":"how-to-authenticate-using-remote-user","toc":[{"title":"Configuration","anchor":"configuration","children":[]},{"title":"Utilisation de REMOTE_USER uniquement pour les pages de connexion","anchor":"using-remote-user-on-login-pages-only","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Guides pratiques","url":"/fr/6.1/howto/"}],"prev":{"docname":"howto/static-files/deployment","title":"Déploiement des fichiers statiques","url":"/fr/6.1/howto/static-files/deployment/"},"next":{"docname":"howto/csp","title":"Comment utiliser la politique de sécurité de contenu de Django","url":"/fr/6.1/howto/csp/"},"formats":{"html":"/fr/6.1/howto/auth-remote-user/","markdown":"/fr/6.1/howto/auth-remote-user.md","json":"/fr/6.1/howto/auth-remote-user.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/howto/auth-remote-user.txt","official":"https://docs.djangoproject.com/fr/6.1/howto/auth-remote-user/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}