Question

Nous avons un site Web fonctionnant sous Apache, dont l'accès comporte un certain nombre de pages statiques protégées via l'authentification HTTP Basic.

J'ai écrit une nouvelle partie du site avec Django en utilisant le support intégré de Django pour la gestion des utilisateurs.

Le problème que j'ai, c'est que les utilisateurs doivent se connecter une fois via l'authentification HTTP Basic, puis à nouveau à l'aide d'un formulaire de connexion Django. C'est à la fois maladroit et très déroutant pour les utilisateurs.

Je me demandais si quelqu'un avait trouvé un moyen de faire que Django enregistre un utilisateur en utilisant les informations d'authentification HTTP Basic.

Je ne compte pas passer un mot de passe à Django, mais si un utilisateur dave a été authentifié par Apache, il doit également être automatiquement connecté à Django en tant que dave .

(Une option serait de faire en sorte qu'Apache et Django partagent un magasin d'utilisateurs pour garantir des noms d'utilisateur et des mots de passe communs, mais cela impliquerait toujours deux invites de connexion, ce que j'essaie d'éviter.)

Était-ce utile?

La solution

Ceci a été ajouté à la version 1.3 de Django. Voir la documentation plus courante pour ceci ici: http://docs.djangoproject.com/en/dev/howto/ auth-remote-user /

Autres conseils

Pour ne prendre en charge que l’autorisation de base sur certaines demandes (et non avec le serveur Web - c’est ainsi que quelqu'un pourrait interpréter le titre de votre question), vous voudrez regarder ici:

http://www.djangosnippets.org/snippets/243/

Vérifiez les liens de Oli. En gros, vous voyez le nom d’utilisateur authentifié vérifié par l’authentification HTTP de base dans Django en consultant request.META ['REMOTE_USER'].

Mise à jour: le patch proposé pour le ticket N ° 689 , disponible dans le référentiel git de telenieko ici . Il s’applique proprement au moins à la révision 9084 de Django.

Activer le backend d'authentification d'utilisateur distant par

  • ajout du RemoteUserAuthMiddleware après AuthenticationMiddleware
  • ajout du paramètre AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

Si vous utilisez lighttpd et FastCGI comme moi, activez mod_auth, créez les informations d'identification d'un utilisateur test (je l'ai appelé testuser et définissez 123 comme mot de passe) et configurez le site Django à exiger une authentification de base.

Le urls.py suivant peut être utilisé pour tester la configuration:

from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
    url(regex='^

Après avoir rechargé lighty et le serveur Django FCGI, le chargement de la racine du site demande à présent une authentification et accepte les informations d'identification testuser , puis génère un cliché de l'objet de la requête. Dans request.META, ces nouvelles propriétés doivent être présentes:

'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'

L’URL / user / peut être utilisé pour vérifier que vous êtes bien connecté en tant que utilisateur test :

<User: testuser>

Et l'URL / users / répertorie maintenant le testuser ajouté automatiquement (ici l'utilisateur admin que j'avais créé lors de l'exécution de syncdb est également affiché):

admin,testuser

Si vous ne souhaitez pas appliquer de correctif à Django, il est facile de détacher les classes RemoteUserAuthBackend et RemoteUserAuthMiddleware dans un module distinct et de vous y reporter dans les paramètres Django.

, view=lambda request: HttpResponse(repr(request), 'text/plain')), url(regex='^user/

Après avoir rechargé lighty et le serveur Django FCGI, le chargement de la racine du site demande à présent une authentification et accepte les informations d'identification testuser , puis génère un cliché de l'objet de la requête. Dans request.META, ces nouvelles propriétés doivent être présentes:

<*>

L’URL / user / peut être utilisé pour vérifier que vous êtes bien connecté en tant que utilisateur test :

<*>

Et l'URL / users / répertorie maintenant le testuser ajouté automatiquement (ici l'utilisateur admin que j'avais créé lors de l'exécution de syncdb est également affiché):

<*>

Si vous ne souhaitez pas appliquer de correctif à Django, il est facile de détacher les classes RemoteUserAuthBackend et RemoteUserAuthMiddleware dans un module distinct et de vous y reporter dans les paramètres Django.

, view=lambda request: HttpResponse(repr(request.user), 'text/plain')), url(regex='^users/

Après avoir rechargé lighty et le serveur Django FCGI, le chargement de la racine du site demande à présent une authentification et accepte les informations d'identification testuser , puis génère un cliché de l'objet de la requête. Dans request.META, ces nouvelles propriétés doivent être présentes:

<*>

L’URL / user / peut être utilisé pour vérifier que vous êtes bien connecté en tant que utilisateur test :

<*>

Et l'URL / users / répertorie maintenant le testuser ajouté automatiquement (ici l'utilisateur admin que j'avais créé lors de l'exécution de syncdb est également affiché):

<*>

Si vous ne souhaitez pas appliquer de correctif à Django, il est facile de détacher les classes RemoteUserAuthBackend et RemoteUserAuthMiddleware dans un module distinct et de vous y reporter dans les paramètres Django.

, view=lambda request: HttpResponse( ','.join(u.username for u in User.objects.all()), 'text/plain')), )

Après avoir rechargé lighty et le serveur Django FCGI, le chargement de la racine du site demande à présent une authentification et accepte les informations d'identification testuser , puis génère un cliché de l'objet de la requête. Dans request.META, ces nouvelles propriétés doivent être présentes:

<*>

L’URL / user / peut être utilisé pour vérifier que vous êtes bien connecté en tant que utilisateur test :

<*>

Et l'URL / users / répertorie maintenant le testuser ajouté automatiquement (ici l'utilisateur admin que j'avais créé lors de l'exécution de syncdb est également affiché):

<*>

Si vous ne souhaitez pas appliquer de correctif à Django, il est facile de détacher les classes RemoteUserAuthBackend et RemoteUserAuthMiddleware dans un module distinct et de vous y reporter dans les paramètres Django.

Il existe httpauth.py . Je suis toujours un newb complet avec Django, donc je ne sais pas comment cela s’intègre exactement, mais cela devrait faire ce que vous cherchez.

Modifier: voici un fil de bogue plus long sur le sujet .

Étant donné que django peut être exécuté de plusieurs manières et que seul modpython vous permet une intégration étroite avec Apache, je ne pense pas que django puisse vous connecter de manière basique sur l’authentification de base d’Apache. L'authentification devrait vraiment être faite au niveau de l'application car cela vous donnera beaucoup plus de contrôle et sera plus simple. Vous ne voulez vraiment pas avoir à partager des données utilisateur entre Python et Apache.

Si vous ne craignez pas d’utiliser une version corrigée de Django, il existe un correctif à l'adresse http: //www.djangosnippets.org/snippets/56/ qui vous donnera un middleware pour prendre en charge l'authentification de base.

L'authentification de base est très simple: si l'utilisateur n'est pas connecté, vous renvoyez un code d'état requis pour l'authentification 401. Cela invite le navigateur à afficher une zone de connexion. Le navigateur fournira ensuite le nom d'utilisateur et le mot de passe sous forme de chaînes codées selon le code bas64. L’entrée wikipedia http://en.wikipedia.org/wiki/Basic_access_authentication est très bonne.

Si le correctif ne fait pas ce que vous voulez, vous pouvez implémenter l'authentification de base vous-même assez rapidement.

Cela semble être une tâche personnalisée pour AuthenticationBackend - voir La documentation de Django sur ce sujet , djangosnippets.org contient des exemples concrets de ce code (voir 1 ou 2 ) (et ce n’est pas vraiment difficile).

Les sous-classes AuthenticationBackend ne doivent avoir que 2 méthodes définies et leur code est assez simple: l'une doit renvoyer un objet Utilisateur pour l'ID utilisateur, la seconde doit effectuer une vérification des informations d'identification et renvoyer un objet Utilisateur si les informations d'identification sont valides.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top