{"title":"How to authenticate using REMOTE_USER","version":"4.0","locale":"el","docname":"howto/auth-remote-user","url":"/el/4.0/howto/auth-remote-user/","canonical":"https://djangodocs.dev/el/4.0/howto/auth-remote-user/","summary":"This document describes how to make use of external authentication sources (where the web server sets the REMOTE_USER environment variable) in your Django…","html":"<h1>How to authenticate using <code class=\"docutils literal notranslate\">REMOTE_USER</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\n(where the web server sets the <code class=\"docutils literal notranslate\">REMOTE_USER</code> environment variable) in your\nDjango applications.  This type of authentication solution is typically seen on\nintranet sites, with single sign-on solutions such as IIS and Integrated\nWindows Authentication or Apache and <a class=\"reference external\" href=\"https://httpd.apache.org/docs/2.2/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=\"http://weblogin.org\">Cosign</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 sets the\n<code class=\"docutils literal notranslate\">REMOTE_USER</code> environment variable for use in the underlying application.  In\nDjango, <code class=\"docutils literal notranslate\">REMOTE_USER</code> is made available in the <a class=\"reference internal\" href=\"/el/4.0/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> attribute.  Django can be configured to make\nuse of the <code class=\"docutils literal notranslate\">REMOTE_USER</code> value using the <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code>\nor <code class=\"docutils literal notranslate\">PersistentRemoteUserMiddleware</code>, and\n<a class=\"reference internal\" href=\"/el/4.0/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> classes found in\n<a class=\"reference internal\" href=\"/el/4.0/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>Παραμετροποίηση<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/4.0/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> στη ρύθμιση <a class=\"reference internal\" href=\"/el/4.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> <strong>μετά</strong> τη middleware κλάση <a class=\"reference internal\" href=\"/el/4.0/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=\"s1\">&#39;...&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth.middleware.RemoteUserMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;...&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Κατόπιν, πρέπει να αντικαταστήσετε την κλάση <a class=\"reference internal\" href=\"/el/4.0/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> με την <a class=\"reference internal\" href=\"/el/4.0/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> μέσα στη ρύθμιση <a class=\"reference internal\" href=\"/el/4.0/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=\"s1\">&#39;django.contrib.auth.backends.RemoteUserBackend&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Με αυτές τις ρυθμίσεις, η <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> θα ανιχνεύσει το username μέσα στο <code class=\"docutils literal notranslate\">request.META['REMOTE_USER']</code> και όχι μόνο θα πιστοποιήσει αλλά και θα εισάγει αυτόν τον χρήστη αυτόματα στο σύστημα, χρησιμοποιώντας την κλάση <a class=\"reference internal\" href=\"/el/4.0/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>Ιδιαίτερη προσοχή πρέπει να δοθεί στο γεγονός ότι η ανωτέρω συγκεκριμένη ρύθμιση απενεργοποιεί την πιστοποίηση του, προεπιλεγμένου, <code class=\"docutils literal notranslate\">ModelBackend</code>. Αυτό σημαίνει ότι αν η τιμή της μεταβλητής <code class=\"docutils literal notranslate\">REMOTE_USER</code> δεν έχει οριστεί, τότε ο χρήστης δεν θα μπορεί να κάνει log in στο σύστημα, ακόμη και αν χρησιμοποιεί το interface του Django admin. Για την επίλυση αυτού, απλώς προσθέστε το <code class=\"docutils literal notranslate\">'django.contrib.auth.backends.ModelBackend'</code> στη λίστα <code class=\"docutils literal notranslate\">AUTHENTICATION_BACKENDS</code>. Με αυτό τον τρόπο το Django θα χρησιμοποιήσει το <code class=\"docutils literal notranslate\">ModelBackend</code> ως fallback αν το <code class=\"docutils literal notranslate\">REMOTE_USER</code> δεν έχει οριστεί.</p>\n<p>Η διαχείριση των χρηστών του Django, όπως τα views μέσα στο <code class=\"docutils literal notranslate\">contrib.admin</code> και η εντολή <a class=\"reference internal\" href=\"/el/4.0/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\">createsuperuser</code></a>, δεν δουλεύουν με τους απομακρυσμένους χρήστες (remote users). Αυτά τα interfaces δουλεύουν με τους χρήστες οι οποίοι είναι αποθηκευμένοι στην βάση δεδομένων ανεξαρτήτως της ρύθμισης <code class=\"docutils literal notranslate\">AUTHENTICATION_BACKENDS</code>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Επειδή η κλάση <code class=\"docutils literal notranslate\">RemoteUserBackend</code> κληρονομεί από την <code class=\"docutils literal notranslate\">ModelBackend</code>, θα έχετε στην διάθεση σας όλο το API, που είναι υλοποιημένο στο <code class=\"docutils literal notranslate\">ModelBackend</code> και αφορά τον έλεγχο δικαιωμάτων των χρηστών.</p>\n<p>Οι χρήστες με το attribute <a class=\"reference internal\" href=\"/el/4.0/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> δεν θα τους επιτραπεί να πιστοποιηθούν. Για να το παρακάμψετε αυτό χρησιμοποιήστε την κλάση <a class=\"reference internal\" href=\"/el/4.0/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>.</p>\n</aside>\n<p>Οι χρήστες με το attribute <a class=\"reference internal\" href=\"/el/4.0/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> δεν θα τους επιτραπεί να πιστοποιηθούν. Για να το παρακάμψετε αυτό χρησιμοποιήστε την κλάση <a class=\"reference internal\" href=\"/el/4.0/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>.</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=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.middleware</span> <span class=\"kn\">import</span> RemoteUserMiddleware\n\n<span class=\"k\">class</span> <span class=\"nc\">CustomHeaderMiddleware</span><span class=\"p\">(</span>RemoteUserMiddleware<span class=\"p\">):</span>\n    header <span class=\"o\">=</span> <span class=\"s1\">&#39;HTTP_AUTHUSER&#39;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Προειδοποίηση</p>\n<p>Να είστε εξαιρετικά προσεκτικοί όταν χρησιμοποιείτε κάποια subclass της <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> η οποία ορίζει δικό της HTTP header. Πρέπει να είστε σίγουροι ότι ο front-end web server ορίζει ή αφαιρεί πάντα αυτόν τον header βασιζόμενος στους κατάλληλους ελέγχους πιστοποίησης. Ποτέ να μην επιτρέπετε στον τελικό χρήστη να μπορεί να καταθέτει ψεύτικες (ή «πλαστογραφημένες») τιμές του header. Εφόσον οι HTTP headers, π.χ <code class=\"docutils literal notranslate\">X-Auth-User</code> και <code class=\"docutils literal notranslate\">X-Auth_User</code> ομαλοποιούνται και οι δύο στο κλειδί <code class=\"docutils literal notranslate\">HTTP_X_AUTH_USER</code> του <code class=\"docutils literal notranslate\">request.META</code>, θα πρέπει, επίσης, να ελέγξετε ότι ο web server σας δεν επιτρέπει πλαστογραφημένους headers οι οποίοι χρησιμοποιούν κάτω παύλες (“_”) αντί σκέτων παυλών (“-”).</p>\n<p>Η παραπάνω προειδοποίηση δεν αφορά μόνο την κλάση <code class=\"docutils literal notranslate\">RemoteUserMiddleware</code> με τις προεπιλεγμένες της ρυθμίσεις (<code class=\"docutils literal notranslate\">header = 'REMOTE_USER'</code>), αφού ένα κλειδί που το όνομα του δεν ξεκινά με το <code class=\"docutils literal notranslate\">HTTP_</code> μέσα στο <code class=\"docutils literal notranslate\">request.META</code>, μπορεί να οριστεί μόνο από τον WSGI server σας και όχι απ’ ευθείας από ένα HTTP request header.</p>\n</aside>\n<p>Αν χρειάζεστε περισσότερο έλεγχο, μπορείτε να δημιουργήσετε το δικό σας backend πιστοποίησης ο οποίος θα κληρονομεί από την κλάση <a class=\"reference internal\" href=\"/el/4.0/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> και θα παρακάμπτει (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\">REMOTE_USER</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\">RemoteUserMiddleware</code> authentication middleware assumes that the HTTP\nrequest header <code class=\"docutils literal notranslate\">REMOTE_USER</code> is present with all authenticated requests. That\nmight be expected and practical when Basic HTTP Auth with <code class=\"docutils literal notranslate\">htpasswd</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/4.0/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> παρέχει υποστήριξη για αυτήν ακριβώς την περίπτωση. Θα διατηρήσει το πιστοποιημένο session μέχρις ότου ο χρήστης κάνει logout ο ίδιος. Η κλάση μπορεί να χρησιμοποιηθεί ως αντικατάσταση της <a class=\"reference internal\" href=\"/el/4.0/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> όπως αναφέρθηκε παραπάνω.</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":"Οδηγοί «Πως-να»","url":"/el/4.0/howto/"}],"prev":{"docname":"howto/index","title":"Οδηγοί «Πως-να»","url":"/el/4.0/howto/"},"next":{"docname":"howto/custom-management-commands","title":"How to create custom django-admin commands","url":"/el/4.0/howto/custom-management-commands/"},"formats":{"html":"/el/4.0/howto/auth-remote-user/","markdown":"/el/4.0/howto/auth-remote-user.md","json":"/el/4.0/howto/auth-remote-user.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/howto/auth-remote-user.txt","official":"https://docs.djangoproject.com/el/4.0/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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}