{"title":"How to authenticate using REMOTE_USER","version":"6.1","locale":"el","docname":"howto/auth-remote-user","url":"/el/6.1/howto/auth-remote-user/","canonical":"https://djangodocs.dev/el/6.1/howto/auth-remote-user/","summary":"This document describes how to make use of external authentication sources in your Django applications. This type of authentication solution is typically seen on…","html":"<h1>How to authenticate using <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>This document describes how to make use of external authentication sources in\nyour Django applications. This type of authentication solution is typically\nseen on intranet sites, with single sign-on solutions such as IIS and\nIntegrated Windows Authentication or Apache and <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>,\n<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>When the web server takes care of authentication it typically provides the\nauthenticated user as <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>. In Django, this value is made available\nin <a class=\"reference internal\" href=\"/el/6.1/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> (as <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> when\nsupplied as an environment variable, as in WSGI, or <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_REMOTE_USER</span></code> when\nsupplied via an HTTP header, as in ASGI). Django can be configured to make use\nof the <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> value using the <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code>, and\n<a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">RemoteUserBackend</span></code></a> classes found in\n<a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">django.contrib.auth</span></code></a>.</p>\n<section id=\"configuration\">\n<h2>Παραμετροποίηση<a class=\"heading-anchor\" href=\"#configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Πρώτα πρέπει να προσθέσετε τη middleware κλάση <a class=\"reference internal\" href=\"/el/6.1/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 class=\"reference internal\" href=\"/el/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> <strong>μετά</strong> τη middleware κλάση <a class=\"reference internal\" href=\"/el/6.1/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>Κατόπιν, πρέπει να αντικαταστήσετε την κλάση <a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">ModelBackend</span></code></a> με την <a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">RemoteUserBackend</span></code></a> μέσα στη ρύθμιση <a class=\"reference internal\" href=\"/el/6.1/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>With this setup, <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> will detect the username in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">request.META['REMOTE_USER']</span></code> (or <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META['HTTP_REMOTE_USER']</span></code> under\nASGI) and will authenticate and auto-login that user\nusing the <a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">RemoteUserBackend</span></code></a>.</p>\n<p>Ιδιαίτερη προσοχή πρέπει να δοθεί στο γεγονός ότι η ανωτέρω συγκεκριμένη ρύθμιση απενεργοποιεί την πιστοποίηση του, προεπιλεγμένου, <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>. Αυτό σημαίνει ότι αν η τιμή της μεταβλητής <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> δεν έχει οριστεί, τότε ο χρήστης δεν θα μπορεί να κάνει log in στο σύστημα, ακόμη και αν χρησιμοποιεί το interface του Django admin. Για την επίλυση αυτού, απλώς προσθέστε το <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.auth.backends.ModelBackend'</span></code> στη λίστα <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code>. Με αυτό τον τρόπο το Django θα χρησιμοποιήσει το <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> ως fallback αν το <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> δεν έχει οριστεί.</p>\n<p>Η διαχείριση των χρηστών του Django, όπως τα views μέσα στο <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.admin</span></code> και η εντολή <a class=\"reference internal\" href=\"/el/6.1/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a>, δεν δουλεύουν με τους απομακρυσμένους χρήστες (remote users). Αυτά τα interfaces δουλεύουν με τους χρήστες οι οποίοι είναι αποθηκευμένοι στην βάση δεδομένων ανεξαρτήτως της ρύθμισης <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\">Σημείωση</p>\n<p>Επειδή η κλάση <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code> κληρονομεί από την <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>, θα έχετε στην διάθεση σας όλο το API, που είναι υλοποιημένο στο <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> και αφορά τον έλεγχο δικαιωμάτων των χρηστών.</p>\n<p>Οι χρήστες με το attribute <a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">is_active=False</span></code></a> δεν θα τους επιτραπεί να πιστοποιηθούν. Για να το παρακάμψετε αυτό χρησιμοποιήστε την κλάση <a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">AllowAllUsersRemoteUserBackend</span></code></a>.</p>\n</aside>\n<p>If your authentication mechanism uses a custom HTTP header and not\n<code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>, you can subclass <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> and set the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">header</span></code> attribute to the desired <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> key. For example:</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>This custom middleware is then used in the <a class=\"reference internal\" href=\"/el/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> setting\ninstead of <a class=\"reference internal\" href=\"/el/6.1/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\">Προειδοποίηση</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> must not be deployed in configurations where a\nclient can supply the header. You must be sure that your web server or\nreverse proxy always sets or strips that header based on the appropriate\nauthentication checks, never permitting an end user to submit a fake (or\n«spoofed») header value.</p>\n<p>Since the HTTP headers <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth-User</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth_User</span></code> (for example)\nboth normalize to the <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_X_AUTH_USER</span></code> key in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code>, you\nmust also check that your web server doesn’t allow a spoofed header using\nunderscores in place of dashes.</p>\n<p>Under WSGI, this warning doesn’t apply to <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> in its\ndefault configuration with <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span> <span class=\"pre\">=</span> <span class=\"pre\">&quot;REMOTE_USER&quot;</span></code>, since a key that\ndoesn’t start with <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_</span></code> in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> can only be set by your\nWSGI server, not directly from an HTTP request header.</p>\n<p>This warning applies under ASGI in all configurations, because there is\nno equivalent for a WSGI server’s ability to place a trusted value in the\nenviron. ASGI deployments <em>must</em> use a reverse proxy as described above\nwhen using this middleware.</p>\n</aside>\n<p>Αν χρειάζεστε περισσότερο έλεγχο, μπορείτε να δημιουργήσετε το δικό σας backend πιστοποίησης ο οποίος θα κληρονομεί από την κλάση <a class=\"reference internal\" href=\"/el/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\"><span class=\"pre\">RemoteUserBackend</span></code></a> και θα παρακάμπτει (override) ένα ή περισσότερα από τα attributes και τις μεθόδους της.</p>\n</section>\n<section id=\"using-remote-user-on-login-pages-only\">\n<span id=\"persistent-remote-user-middleware-howto\"></span><h2>Χρήση του <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> μόνο στις σελίδες login<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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> authentication middleware assumes that the HTTP\nrequest header <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> is present with all authenticated requests. That\nmight be expected and practical when Basic HTTP Auth with <code class=\"docutils literal notranslate\"><span class=\"pre\">htpasswd</span></code> or\nsimilar mechanisms are used, but with Negotiate (GSSAPI/Kerberos) or other\nresource intensive authentication methods, the authentication in the front-end\nHTTP server is usually only set up for one or a few login URLs, and after\nsuccessful authentication, the application is supposed to maintain the\nauthenticated session itself.</p>\n<p>Η middleware κλάση <a class=\"reference internal\" href=\"/el/6.1/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> παρέχει υποστήριξη για αυτήν ακριβώς την περίπτωση. Θα διατηρήσει το πιστοποιημένο session μέχρις ότου ο χρήστης κάνει logout ο ίδιος. Η κλάση μπορεί να χρησιμοποιηθεί ως αντικατάσταση της <a class=\"reference internal\" href=\"/el/6.1/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> όπως αναφέρθηκε παραπάνω.</p>\n</section>","rootId":"how-to-authenticate-using-remote-user","toc":[{"title":"Παραμετροποίηση","anchor":"configuration","children":[]},{"title":"Χρήση του REMOTE_USER μόνο στις σελίδες login","anchor":"using-remote-user-on-login-pages-only","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/el/6.1/howto/"}],"prev":{"docname":"howto/static-files/deployment","title":"How to deploy static files","url":"/el/6.1/howto/static-files/deployment/"},"next":{"docname":"howto/csp","title":"How to use Django’s Content Security Policy","url":"/el/6.1/howto/csp/"},"formats":{"html":"/el/6.1/howto/auth-remote-user/","markdown":"/el/6.1/howto/auth-remote-user.md","json":"/el/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/el/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"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}