{"title":"Come autenticarsi usando REMOTE_USER","version":"4.1","locale":"it","docname":"howto/auth-remote-user","url":"/it/4.1/howto/auth-remote-user/","canonical":"https://djangodocs.dev/it/4.1/howto/auth-remote-user/","summary":"Questo documento descrive come utilizzare fonti di autenticazione esterne (dove il web server imposta la variabile di ambiente REMOTE_USER ) nelle applicazioni…","html":"<h1>Come autenticarsi 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>Questo documento descrive come utilizzare fonti di autenticazione esterne (dove il web server imposta la variabile di ambiente <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>) nelle applicazioni Django. Questo tipo di soluzione di autenticazione tipicamente si vede in siti intranet, con soluzioni single sign-on come IIS e Integrated Windows Authentication oppure 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>, <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>, ecc.</p>\n<p>Quando il web server si occupa dell’autenticazione tipicamente imposta la variabile d’ambiente <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> da usare nell’applicazione. In Django <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> viene resa disponibile nell’attributo <a class=\"reference internal\" href=\"/it/4.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>. Django può essere configurato per usare il valore di <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> usando le classi <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> o <code class=\"docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code> e <a class=\"reference internal\" href=\"/it/4.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> che si trovano in <a class=\"reference internal\" href=\"/it/4.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>Configurazione<a class=\"heading-anchor\" href=\"#configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>In primo luogo, devi aggiungere la classe <a class=\"reference internal\" href=\"/it/4.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> nel file settings.py <a class=\"reference internal\" href=\"/it/4.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>  posizionato <strong>dopo</strong> la classe <a class=\"reference internal\" href=\"/it/4.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=\"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>Poi, devi sostituire <a class=\"reference internal\" href=\"/it/4.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> con <a class=\"reference internal\" href=\"/it/4.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> nella impostazione di <a class=\"reference internal\" href=\"/it/4.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=\"s1\">&#39;django.contrib.auth.backends.RemoteUserBackend&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Con questa configurazione, <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> rileverà il nome utente in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META['REMOTE_USER']</span></code> e autenticherà e farà login automaticamente di quell’utente usando la <a class=\"reference internal\" href=\"/it/4.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>Sii cosciente che questa particolare configurazione disabilita l’autenticazione con il <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> di default. Questo significa che se il valore di  <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> non è impostato, l’utente non potrà fare log in, anche utilizzando l’interfaccia di amministrazione di Django. Aggiungendo <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.auth.backends.ModelBackend'</span></code> all’elenco <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code> si userà <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code> come ripiego se è assente <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> , risolvendo questo inconveniente.</p>\n<p>La gestione utenti di Django, come le view in <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.admin</span></code> e il comando di gestione <a class=\"reference internal\" href=\"/it/4.1/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a> , non si integrano con gli utenti remoti. Queste interfacce lavorano con gli utenti memorizzati nel database, indipendentemente dagli <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>Poiché il <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code> eredita da <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>, avrai ancora tutto il controllo sui permessi che è implementato in <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>.</p>\n<p>Gli utenti con l’attributo <a class=\"reference internal\" href=\"/it/4.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> non avranno il permesso di autenticarsi. Usa <a class=\"reference internal\" href=\"/it/4.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> se vuoi permettere l’autenticazione.</p>\n</aside>\n<p>Se il tuo meccanismo di autenticazione usa una intestazione HTTP personalizzata, e non <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>, puoi derivare <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> e impostare l’attributo <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span></code> alla chiave <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> desiderata.  Per esempio:</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=\"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<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomHeaderMiddleware</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=\"s1\">&#39;HTTP_AUTHUSER&#39;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avvertimento</p>\n<p>Sii molto attento se utilizzi una sottoclasse di <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> con un’intersatione HTTP personalizzata. Devi essere sicuro che il tuo  front-end web server imposti sempre o rimuova quella intestazione in base agli appropriati controlli di autenticazione, impedendo ad un utente di inviare un falso (o «spoofed») valore di intestazione . Poiché le intestazioni HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth-User</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth_User</span></code> (per esempio) sono entrambe normalizzate alla chiave <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_X_AUTH_USER</span></code> in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code>, devi anche controllare che il tuo  web server non permetta intestazioni false utilizzando trattini bassi al posto dei trattini.</p>\n<p>Questo avvertimento non si applica a <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> nella sua configurazione di default con <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span> <span class=\"pre\">=</span> <span class=\"pre\">'REMOTE_USER'</span></code>, perché una chiave che non inizia con <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_</span></code> in <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> può essere impostata solo dal tuo server WSGI, non direttamente da una intestazione di richiesta HTTP.</p>\n</aside>\n<p>Se hai necessità di più controllo, puoi creare il tuo backend di autenticazione che eredita da <a class=\"reference internal\" href=\"/it/4.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> e sostituisce uno o più dei suoi attributi e metodi.</p>\n</section>\n<section id=\"using-remote-user-on-login-pages-only\">\n<span id=\"persistent-remote-user-middleware-howto\"></span><h2>Usare <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> solo sulle pagine di 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>Il <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> presuppone che l’intestazione HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> sia presente in tutte le richieste che necessitano di autenticazione. Può essere quindi usato quando si ha a che fare con il Basic HTTP Auth con <code class=\"docutils literal notranslate\"><span class=\"pre\">htpasswd</span></code> o altri semplici meccanismi; quando invece si usa Negotiate (GSSAPI/Kerberos) o un altro metodo di autenticazione che richiede maggiori risorse, l’autenticazione nel server HTTP di front-end è normalmente utilizzata in ambienti ristretti con pochi URL di accesso, e dopo un’autenticazione riuscita, si suppone che l’applicazione mantenga autonomamente la sessione autenticata.</p>\n<p><a class=\"reference internal\" href=\"/it/4.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> fornisce supporto per questo caso d’uso. Mantiene la sessione autenticata fino ad un logout esplicito dell’utente. La classe può essere usata in sostituzione in cascata di <a class=\"reference internal\" href=\"/it/4.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> nella documentazione di cui sopra.</p>\n</section>","rootId":"how-to-authenticate-using-remote-user","toc":[{"title":"Configurazione","anchor":"configuration","children":[]},{"title":"Usare REMOTE_USER solo sulle pagine di login","anchor":"using-remote-user-on-login-pages-only","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"guide «How-to»","url":"/it/4.1/howto/"}],"prev":{"docname":"howto/index","title":"guide «How-to»","url":"/it/4.1/howto/"},"next":{"docname":"howto/csrf","title":"How to use Django’s CSRF protection","url":"/it/4.1/howto/csrf/"},"formats":{"html":"/it/4.1/howto/auth-remote-user/","markdown":"/it/4.1/howto/auth-remote-user.md","json":"/it/4.1/howto/auth-remote-user.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/howto/auth-remote-user.txt","official":"https://docs.djangoproject.com/it/4.1/howto/auth-remote-user/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}