Buscando una guía completa para la creación de backends de autenticación personalizados en Django, o punteros

StackOverflow https://stackoverflow.com/questions/2153223

Pregunta

Estoy tratando de establecer un programa de fondo personalizada que realiza consultas a otra base de datos, para la cual he creado un modelo en el sistema. Utiliza sus propias reglas (correo electrónico en lugar del nombre de usuario y una contraseña diferente con sal / hash) así que no puedo utilizar construido en la autenticación. He creado un motor de autenticación personalizada, así:

class BlahBlahBackend:

    def check_password():
        # check password code here
        return true

    def authenticate(self, email=None, password=None):
        import myapp.models.loginmodel
        try:
            person =  myapp.models.loginmodel.People.objects.get(email=email)
            if check_password(password, person.password):
                try:
                    user = User.objects.get(email=email)
                except User.DoesNotExist:
                    username=person.first_name + person.last_name
                    name_count = User.objects.filter(username__startswith = username).count()
                    if name_count:
                        username = '%s%s'%(username, name_count + 1)
                        user = User.objects.create_user(username,email)
                    else:
                        user = User.objects.create_user(username,email)
        except People.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

He añadido BlahBlahBackend como un motor de autenticación:

AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend',                            'Socialauth.auth_backends.OpenIdBackend',                            'Socialauth.auth_backends.TwitterBackend',                            'Socialauth.auth_backends.FacebookBackend',                            'Socialauth.auth_backends.BlahBlahBackend',                            )

Como se puede ver, también estoy usando algunos backends de autenticación pre-existentes que también están en socialauth.

Tengo un formulario de presentación que señala al siguiente punto de vista:

def blahblah_login_complete(request):
    email = request.POST.get('email')
    password = request.POST.get('password')
    user = authenticate(email,password)
    # if user is authenticated then login user
    if user:
        login(request, user)
    else:
        return HttpResponseRedirect(reverse('socialauth_login_page'))

Sin embargo, cuando intento de inicio de sesión de esta manera, parece que uno o más de los otros backends están actuando como si estuviera tratando de iniciar la sesión utilizando su método.

He leído que backends se almacenan en caché y así RAN

Session.objects.all().delete()

para borrar la memoria caché backends.

Mis principales preguntas son:

  1. ¿El orden en el que se enumeran en AUTHENTICATION_BACKENDS
  2. ¿Cómo decide el sistema / saber qué backend para su uso? Esto nunca fue aclarada por cualquiera de la documentación, y me resulta un poco confuso.
  3. ¿Hay alguna manera de forzar el uso de una autorización específica en base a la petición. En otras palabras, si alguien envía un formulario, hay una manera de obligarlos a usar la autenticación basada en formularios de inicio de sesión en comparación con el inicio de sesión a través de OpenID o Twitter?

Actualización:

Funciona! Esto es muy fresco, gracias. Supongo que simplemente parecía que el doc Django estaba diciendo "Usted no tiene que hacer nada más, es sólo una especie de obras como la magia" y resulta que este es el caso en absoluto. En tanto que el backend está ahí y las credenciales se ha configurado correctamente, la autenticación funcionará. Pues resulta que el verdadero problema era una mala configuración en el archivo urls.py que no se envía el mensaje desde el formulario de acceso al controlador correcto, por lo que seguía tratando de utilizar otro método de autenticación.

¿Fue útil?

Solución

Se supone que utilizar argumentos de palabras clave para django.contrib.auth.authenticate () Los nombres deben coincidir con los nombres de los argumentos en el método de autenticar el servidor. El backend predeterminado controla los nombres 'nombre de usuario' y 'contraseña'.

Su backend puede utilizar un nombre diferente para los argumentos clave ej .: blahblah_email y blahblah_password, y luego autenticar la llamada (blahblah_email = ..., blahblah_password = ...).

Otros consejos

  1. Es claramente descrito aquí - Django intenta con cada backend con el fin definido, si primero no logra autenticar va al segundo, etc.

  2. Creo que se puede cargar la clase de back-end de forma dinámica y autenticar directamente a través de él. Django vistazo a las fuentes de función autenticar () sobre cómo hacerlo.

django-cas será una referencia buena para ti :)

Y sí, el orden de AUTHENTICATION_BACKENDS importa.

bucles de Django sobre la lista de backends y parada en el primer back-end que tiene un método authenticate aceptar los parámetros de credenciales que se le ha pasado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top