Django, anfordern.Benutzer ist immer in Anonymen Nutzer
Ich bin mit einem benutzerdefinierten Authentifizierung-backend für Django (das läuft couchdb). Ich habe ein custom-user-Modell.
Als Teil der Anmeldung, ich bin dabei ein request.user = user
und speichern Sie die Benutzer-id in der session.
Aber auf nachfolgende Anfragen, die ich nicht in der Lage zum abrufen der Anfrage.Benutzer. Es ist immer eine AnonymousUser. Kann ich aber abrufen der Benutzer-id aus der session und kann bestätigen, dass der session-cookie wird richtig gesetzt.
Was bin ich?
Will ich nicht die Verwendung einer relationalen db, wie ich will, um alle meine user-Daten in couchdb.
Bearbeiten: ich habe geschrieben eine Klasse, die nicht Erben von Django, die auth-User. Es hat allerdings den Benutzernamen und E-Mail-Attribute. Aus diesem Grund, mein backend nicht wieder eine Klasse abgeleitet von auth-User.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte erläutern. Wenn Sie einen benutzerdefinierten Benutzer-Modell (unterscheidet sich von einem benutzerdefinierten PROFIL-Modell), dann sind Sie grundsätzlich auf Ihren eigenen und den django.contrib.auth-framework kann dir nicht helfen mit der Authentifizierung. Wenn Sie schreiben Ihre eigenen Authentifizierungs-system und sind nicht mit django.contrib.auth, dann müssen Sie diese Funktion deaktivieren, weil es scheint zu stören mit Ihrem system.
Den
request.user
wird durch dendjango.contrib.auth.middleware.AuthenticationMiddleware
.Überprüfen
django/contrib/auth/middleware.py
:Dann schauen Sie auf die
get_user
Funktion indjango/contrib/auth/__init__.py
:Ihre backend wird die Notwendigkeit zur Umsetzung der
get_user
Funktion.Du sagst du hast geschrieben, eine benutzerdefinierte Authentifizierung-backend, aber in der Tat, was Sie scheinen geschrieben zu haben, ist eine vollständige benutzerdefinierte Authentifizierungs-app, die keine Schnittstelle mit Django ' s
contrib.auth
.Wenn Sie möchten, verwenden Sie eine nicht-relationale Datenbank zur Authentifizierung von Daten, ist alles was Sie tun müssen, ist erstellen Sie eine Klasse mit zwei Methoden:
get_user(user_id)
undauthenticate(**credentials)
. Sehen die Dokumentation. Sobald Sie einen Benutzer authentifiziert, rufen Sie einfach bei Django ist normal login-Methoden. Es sollte keinen Grund manuell einstellenrequest.user
oder setzen alles in die session.Update nach Bearbeiten Das hat nichts damit zu tun. Es gibt keine Anforderung, dass die user-Klasse wird von
auth.models.User
. Sie müssen nur noch definierenget_user
Methode wird eine Instanz der Klasse user.Ich habe auch die benutzerdefinierte Authentifizierung-backend und bekam immer
AnonymousUser
nach erfolgreiche - Authentifizierung und login. Ich hatte dieget_user
Methode in meinem backend. Was mir fehlte, war, dassget_user
muss der Benutzer durchpk
nur, nicht per E-Mail oder was auch immer Sie Ihre Anmeldeinformationen inauthenticate
sind:Seine leicht zu übersehen, wird diese Zeile in den docs:
So geschah es, dass
email
ist nicht der primary key in mein schema. Hoffe, das spart jemand etwas Zeit.Ich hatte ähnliches problem, wenn ich die benutzerdefinierte Authentifizierung-backend. Ich benutzte Feld, anders als der Primärschlüssel in der Methode get_user.
Es direkt gelöst nach der Verwendung von primären Schlüssel, die müssen die Nummer (keine str)
Nach senden-Token mit Authorization-header, die token bekommen in der dispatch-Funktion, wie unten:
"'
So sind Sie über django_role_permission ist HasRoleMixin, die dispatch-Methode dieses mixin zu verstecken wird der Versand der anzeigen.
Ich denke, dass die Lösung ist, neu zu definieren, Mixins Rollen-Berechtigungen