4 Stimmen

Django - Lesen der aktuellen Benutzer-Authentifizierung Backend-Klasse

Ich verwende ein benutzerdefiniertes Authentifizierungs-Backend mit Django, um automatisch Benutzer aus einem Altsystem zu erstellen und anzumelden. Mein Backend Klasse ist dies:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from sfi.models import Employee
import base64, hashlib

class SFIUserBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        if not username or not password:
            return

        digest = base64.standard_b64encode(hashlib.md5(password).digest())
        user = None
        try:
            employee = Employee.objects.get(login=username, passwd=digest)
            user, created = User.objects.get_or_create(username=username)
            if created:
                # setting attributes
                user.first_name = employee.names[:30]
                user.last_name = employee.surnames[:30]
                user.is_staff = True
                user.save()
        except Employee.DoesNotExist:
            pass

        return user

Bis jetzt funktioniert es gut. Ich muss jedoch die Backend-Klasse des aktuell angemeldeten Benutzers in einer Vorlage lesen.

Verwendung von request.user.backend sagt, dass user hat nicht das Attribut backend... und ich kann es nicht aus der Sitzung lesen (mit request.session._auth_user_backend ), weil das Django-Vorlagensystem sich beschwert, dass "Variablen und Attribute nicht mit Unterstrichen beginnen dürfen".

Ich verwende django.contrib.auth.views.login um den Benutzern die Anmeldung zu ermöglichen. Was übersehe ich?

2voto

Chris W. Punkte 34843

El backend Attribut wird dem user Objekt, wenn der Benutzer sich mit dem django.contrib.auth.authenticate(username='foo',password='bar') Funktion.

Diese Funktion ruft ihrerseits alle AUTHENTICATION_BACKENDS die Sie in Ihrem settings.py Datei, bis es sich mit einer von ihnen erfolgreich authentifizieren kann.

Wenn Ihre Benutzer "eingeloggt" sind, aber nicht über eine backend Das bedeutet wahrscheinlich, dass Sie sie nicht richtig authentifizieren. Vielleicht rufen Sie Ihre SFIUserBackend.authenticate Funktion direkt aufzurufen, wenn Sie eigentlich die django.contrib.auth.authenticate Funktion?

Sehen Sie sich diese Dokumente zur benutzerdefinierten Authentifizierung .

0voto

lprsd Punkte 80189

Sie sollten sie in der Ansicht lesen und eine entsprechende menschliche Form dieses Klassennamens als Nachricht senden.

0voto

OrangeDog Punkte 33207

Während authenticate() fügt die user.backend Attribut und login() speichert es aus irgendeinem Grund in der Sitzung get_user() fügt es dem Benutzer nicht wieder zu. Ich habe einen Patch eingereicht .

Um in einer anderen Anfrage darauf zugreifen zu können, müssen Sie daher request.session[django.contrib.auth.BACKEND_SESSION_KEY] .

Sie können auch ein benutzerdefiniertes Tag schreiben oder es in Ihren Kontext einfügen (unter einem beliebigen Namen), um die Verwendung zu erleichtern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X