tutorial pelicula online get_current_site example español cantante django django-sites

pelicula - ¿Cómo conseguir usuarios únicos en múltiples sitios de Django impulsados por el marco de "sitios"?



django tutorial (3)

Estoy construyendo un marco de sitio Django que alimentará varios sitios independientes, todos usando las mismas aplicaciones pero con sus propias plantillas. Planeo lograr esto utilizando múltiples archivos de configuración y configurando un SITE_ID único para ellos, como se sugiere en los documentos de Django para el marco django.contrib.sites

Sin embargo, no quiero que un usuario del sitio A pueda iniciar sesión en el sitio B. Después de inspeccionar la tabla de usuarios creada por syncdb, no veo ninguna columna que pueda restringir a un usuario a un sitio específico. También he intentado crear un usuario, ''bob'', en un sitio y luego usar el comando de shell para enumerar a todos los usuarios del otro lado y, por supuesto, Bob aparece allí.

¿Cómo puedo asegurar que todos los usuarios estén restringidos a sus respectivos sitios?


Debe saber que muchas personas se quejan del sistema de autorización y los privilegios predeterminados de Django; simplemente tiene reglas para los objetos, para las instancias de los objetos, lo que significa que sin escribir ningún código no sería posible.

Sin embargo, hay algunos enlaces de autorización que pueden ayudarlo a lograr este objetivo, por ejemplo:

Eche un vistazo allí: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py y para el permiso de clase.

Puede agregar su propio permiso y definir reglas para ellos (hay una ForeignKey para el usuario y para ContentType).

Sin embargo2, sin la reproducción / cambio de algunos métodos, podría ser difícil.


Puede conectar sus propios backends de autorización y autenticación que tienen en cuenta el ID del sitio.

Consulte otras fuentes de autenticación en la documentación de django y las referencias de backends de autenticación

Además, si su fuente de django es demasiado antigua, siempre puede modificar el código de autenticación () o de inicio de sesión () usted mismo. Después de todo ... ¿No es esa una de las maravillas del código abierto? Tenga en cuenta que al hacerlo puede afectar su compatibilidad con otros módulos.

Espero que esto ayude.


La forma más compatible de hacerlo sería crear un modelo de perfil de usuario que incluya una clave externa para el modelo de sitio, luego escribir un backend de autenticación personalizado que verifique el sitio actual con el valor de ese FK. Algún código de muestra:

Defina su modelo de perfil, digamos en app / models.py:

from django.db import models from django.contrib.sites.models import Site from django.contrib.auth.models import User class UserProfile(models.Model): user = models.OneToOneField(User) site = models.ForeignKey(Site)

Escriba su backend de autenticación personalizado, heredado del predeterminado, digamos en app / auth_backend.py:

from django.contrib.auth.backends import ModelBackend from django.contrib.sites.models import Site class SiteBackend(ModelBackend): def authenticate(self, **credentials): user_or_none = super(SiteBackend, self).authenticate(**credentials) if user_or_none and user_or_none.userprofile.site != Site.objects.get_current(): user_or_none = None return user_or_none def get_user(self, user_id): try: return User.objects.get( pk=user_id, userprofile__site=Site.objects.get_current()) except User.DoesNotExist: return None

Este respaldo de autenticación asume que todos los usuarios tienen un perfil; debe asegurarse de que su proceso de creación / registro de usuario siempre cree uno.

El método de authenticate anulado garantiza que un usuario solo pueda iniciar sesión en el sitio correcto. Se get_user método get_user en cada solicitud para obtener al usuario de la base de datos en función de la información de autenticación almacenada en la sesión del usuario; nuestra anulación garantiza que un usuario no pueda iniciar sesión en el sitio A y luego usar esa misma cookie de sesión para obtener acceso no autorizado al sitio B. (Gracias a Jan Wrobel por señalar la necesidad de manejar este último caso).