{"title":"Cómo autenticarse usando REMOTE_USER","version":"5.2","locale":"es","docname":"howto/auth-remote-user","url":"/es/5.2/howto/auth-remote-user/","canonical":"https://djangodocs.dev/es/5.2/howto/auth-remote-user/","summary":"Este documento describe cómo hacer uso de fuentes de autenticación externas (donde el servidor web establece la variable de entorno REMOTE_USER ) en sus…","html":"<h1>Cómo autenticarse usando <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code><a class=\"heading-anchor\" href=\"#how-to-authenticate-using-remote-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Este documento describe cómo hacer uso de fuentes de autenticación externas (donde el servidor web establece la variable de entorno <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>) en sus aplicaciones Django. Este tipo de solución de autenticación se suele ver en sitios de intranet, con soluciones de inicio de sesión único como IIS y autenticación integrada de Windows o Apache y <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 href=\"#id2\"><span class=\"problematic\" id=\"id3\">`Cosign`_</span></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>Cuando el servidor web se encarga de la autenticación, normalmente establece la variable de entorno <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> para su uso en la aplicación subyacente. En Django, “”REMOTE_USER”” está disponible en la solicitud atributo  <a class=\"reference internal\" href=\"/es/5.2/ref/request-response/#django.http.HttpRequest.META\" title=\"django.http.HttpRequest.META\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.META</span></code></a> Django se puede configurar para hacer uso del valor <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> usando las clases <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> o <code class=\"docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code>, y <a class=\"reference internal\" href=\"/es/5.2/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> que se encuentran en :mod`”django.contrib.auth`.</p>\n<section id=\"configuration\">\n<h2>Configuración<a class=\"heading-anchor\" href=\"#configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Primero debe agregar la clase <a class=\"reference internal\" href=\"/es/5.2/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.middleware.RemoteUserMiddleware</span></code></a> a la configuración de <a class=\"reference internal\" href=\"/es/5.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> después de <a class=\"reference internal\" href=\"/es/5.2/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.middleware.AuthenticationMiddleware</span></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><span class=\"n\">MIDDLEWARE</span> <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>Luego, debe remplazar la clase <a class=\"reference internal\" href=\"/es/5.2/ref/contrib/auth/#django.contrib.auth.backends.ModelBackend\" title=\"django.contrib.auth.backends.ModelBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code></a> por <a class=\"reference internal\" href=\"/es/5.2/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> en la configuración <a class=\"reference internal\" href=\"/es/5.2/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></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><span class=\"n\">AUTHENTICATION_BACKENDS</span> <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>Con esta configuración, <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> detectará el usuario en <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META['REMOTE_USER']</span></code> y autenticará e iniciará automáticamente la sesión de usuario usando <a class=\"reference internal\" href=\"/es/5.2/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a>.</p>\n<p>Sea conciente de que esta configuración particular deshabilita la autenticación por defecto con el <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>. Esto significa que si el valor del <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> no está definido, entonces el usuario no será capaz de ingresar, incluso usando la interfaz de administración de Django.  Agregando <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.auth.backends.ModelBackend'</span></code> a la lista de <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code>, servirá como respaldo si <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> no está definido, lo que resolverá estas problemáticas.</p>\n<p>El sistema de usuarios de Django, como las vistas en <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.admin</span></code> y el comando de manejo <a class=\"reference internal\" href=\"/es/5.2/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a>, no se integran con usuarios remotos. Estas interfaces trabajan con usuarios almacenados en la base de datos independientemente de <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Como <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code> hereda de <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>, todavía tendrá la misma comprobación de permisos implementada en <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>.</p>\n<p>Usuarios con <a class=\"reference internal\" href=\"/es/5.2/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\"><span class=\"pre\">is_active=False</span></code></a> no serán capaces de autenticarse. Use <a class=\"reference internal\" href=\"/es/5.2/ref/contrib/auth/#django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\" title=\"django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AllowAllUsersRemoteUserBackend</span></code></a> si quiere permitirles hacerlo.</p>\n</aside>\n<p>Si su mecanismo de autenticación usa una cabecera HTTP personalizada y <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> es <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, puede extender la clase <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> y asignar el atributo <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span></code> a la llave <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>request.META` deseada. Por ejemplo:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/middleware.py</span></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=\"w\"> </span><span class=\"nn\">django.contrib.auth.middleware</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RemoteUserMiddleware</span>\n\n\n <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomHeaderRemoteUserMiddleware</span><span class=\"p\">(</span><span class=\"n\">RemoteUserMiddleware</span><span class=\"p\">):</span>\n     <span class=\"n\">header</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;HTTP_AUTHUSER&quot;</span>\n</code></pre></figure>\n<p>Este middleware personalizado luego se usa en el parámetro <a class=\"reference internal\" href=\"/es/5.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> de la configuración en vez de <a class=\"reference internal\" href=\"/es/5.2/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.middleware.RemoteUserMiddleware</span></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><span class=\"n\">MIDDLEWARE</span> <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\">Advertencia</p>\n<p>Sea muy cuidadoso al usar una subclase de <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> con un encabezado HTTP personalizado. Debe asegurarse que su servidor web siempre defina o separe ese encabezado basado en las validaciones apropiadas de autenticación, nunca permitiendo que un usuario final envíe un encabezado falso (o envenenado). Desde que los encabezados HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth-User</span></code>  y <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth_User</span></code> (por ejemplo) se normalizan en la llave <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_X_AUTH_USER</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code>, usted debe verificar que el servidor web no permita encabezados envenenados usando guiones bajos en lugar de guiones.</p>\n<p>Esta advertencia no se aplica a <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> en su configuración por omisión con <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span> <span class=\"pre\">=</span> <span class=\"pre\">'REMOTE_USER'</span></code>, pues las llaves de <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> que no comiencen con <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_</span></code> solo pueden ser establecidas por el servidor WSGI, no directamente desde una cabecera de petición HTTP.</p>\n</aside>\n<p>Si necesita más control, puedes crear su propio backend de autenticación que herede de <a class=\"reference internal\" href=\"/es/5.2/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> y redefinir uno o más de sus atributos y métodos.</p>\n</section>\n<section id=\"using-remote-user-on-login-pages-only\">\n<span id=\"persistent-remote-user-middleware-howto\"></span><h2>Usando <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> en paginas de ingreso solamente<a class=\"heading-anchor\" href=\"#using-remote-user-on-login-pages-only\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>El middleware de autenticación <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> asume que el encabezado de solicitud HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> está presente con todas las solicitudes autenticadas. Eso podría ser esperado y práctico cuando se utiliza autenticación HTTP básica con <code class=\"docutils literal notranslate\"><span class=\"pre\">htpasswd</span></code> o mecanismos similares, pero con Negotiate (GSSAPI/Kerberos) u otros métodos de autenticación intensivos en recursos, la autenticación en el servidor HTTP front-end normalmente solo se configura para una o varias direcciones URL de inicio de sesión, y después de una autenticación correcta, se supone que la aplicación debe mantener la sesión autenticada.</p>\n<p><a class=\"reference internal\" href=\"/es/5.2/ref/middleware/#django.contrib.auth.middleware.PersistentRemoteUserMiddleware\" title=\"django.contrib.auth.middleware.PersistentRemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code></a> proporciona soporte para este caso de uso. Mantendrá la sesión autenticada hasta que el usuario cierre la sesión explícitamente. La clase se puede utilizar como un reemplazo directo de <a class=\"reference internal\" href=\"/es/5.2/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code></a> en la documentación anterior.</p>\n</section>","rootId":"how-to-authenticate-using-remote-user","toc":[{"title":"Configuración","anchor":"configuration","children":[]},{"title":"Usando REMOTE_USER en paginas de ingreso solamente","anchor":"using-remote-user-on-login-pages-only","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/es/5.2/howto/"}],"prev":{"docname":"howto/static-files/deployment","title":"How to deploy static files","url":"/es/5.2/howto/static-files/deployment/"},"next":{"docname":"howto/csrf","title":"Cómo utilizar la protección CSRF de Django","url":"/es/5.2/howto/csrf/"},"formats":{"html":"/es/5.2/howto/auth-remote-user/","markdown":"/es/5.2/howto/auth-remote-user.md","json":"/es/5.2/howto/auth-remote-user.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/howto/auth-remote-user.txt","official":"https://docs.djangoproject.com/es/5.2/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"]}