2017-11-12 3 views
0

Ich arbeite an einem Projekt, wo ich 3 Arten von Benutzern haben muss.Django Mehrere Auth Modelle

  • Admin
  • Anbieter
  • Kunden

Ich möchte für alle drei von ihnen separate Modelle zu haben in einem gemeinsamen Benutzermodell Vendor & Kunden stattdessen ein Typfeld zu haben.

Mein erster Ansatz für dieses Problem war es, alle Modelle von Nebenklassen des AbstractUser Modell

# models.py 
from django.contrib.auth.models import AbstractUser 

class Customer(AbstractUser): 
    pass 


class Vendor(AbstractUser): 
    pass 

zu definieren und einen benutzerdefinierten Authentifizierungs-Backend fügen Sie die Authentifizierung von Benutzern auf dem Request-Objekt basieren zu handhaben.

# settings.py 

AUTHENTICATION_BACKENDS = ['backends.CustomAuthBackend'] 

Und meine backends.py-Datei wird die Logik enthalten, um Benutzer zu authentifizieren und für jeden auf dem Request-Objekt anhand einer unterschiedlichen Modelle.

# backends.py 
from __future__ import print_function 


class CustomAuthBackend(object): 

    def authenticate(self, request, username=None, password=None): 
     # authenticate user based on request object 

    def get_user(self, user_id): 
     # logic to get user 

Allerdings funktioniert das nicht und sieht aus wie ich auch die AUTH_USER_MODEL in settings.py specifiy müssen, die für die Authentifizierung verwendet wird.

Ist es überhaupt möglich.Do Django erlauben, aus 3 verschiedenen Tabellen zu authentifizieren. Wie kann ich damit fortfahren? Gibt es einen anderen Ansatz dafür und was sollte ich ändern?

Antwort

0

django.contrib.auth ist entworfen, um mit einem UserModel zu arbeiten. Je nachdem, was Sie erreichen möchten, gibt es unterschiedliche Ansätze.

Wenn Sie nur verschiedene Arten von Profilen/Metadaten für die verschiedenen Benutzertypen speichern möchten, können Sie multi table inheritance verwenden - in diesem Fall können Sie das Standardbenutzermodell verwenden.

Wenn es zu verschiedenen Berechtigungen kommt, die auf dem Benutzertyp basieren, sollten Sie dies nicht mit separaten Klassen lösen. Verwenden Sie stattdessen groups. Dieser Ansatz ist viel flexibler. Es kann fast immer passieren, dass eine Person zu mehr als einer Benutzergruppe gehört. Wenn Sie dies basierend auf den Benutzerklassen modellieren, sind Sie in Schwierigkeiten.

0

Ich habe ähnliche Mitarbeiter vor ein paar Tagen gemacht, Sie sind in der richtigen Vorgehensweise. Aber es müssen noch einige andere Dinge geändert werden, damit es funktioniert. Ich werde erklären, was ich getan habe, um Erfolg zu haben.

Zuerst müssen Sie Ihr eigenes Benutzermodell anpassen, und Sie müssen es in erster Linie tun, bevor Sie die Migrationen vornehmen. Und auch in der Modelldatei definieren Sie verschiedene userManager, um verschiedene Arten von Benutzern zu managen. Dann müssen Sie in Ihrer Einstellungsdatei AUTH_USER_MODEL und AUTHENTICATION_BACKENDS setzen, AUTH_USER_MODEL ist das Standardbenutzermodell, das django für die Authentifizierung verwendet, und Sie können nur ein Benutzermodell festlegen, aber für AUTHENTICATION_BACKENDS können Sie mehrere Backends verwenden, es ist eine Liste und eine Django-Schleife jede Option, um sich zu authentifizieren. Standardmäßig verwenden Sie django.contrib.auth.backends.ModelBackend, Sie können Ihre eigenen Auth-Backends hinzufügen. Überprüfen Sie, wie Sie Ihr eigenes Authentifizierungs-Backend erstellen: https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#writing-an-authentication-backend. Und abhängig von Ihrer Anwendung, müssen Sie möglicherweise auch die Serializer-Funktion anpassen und einige Klassen überschreiben, damit es funktioniert.In meiner eigenen Anwendung verwendete ich das DRF- und das JWT-Token zur Authentifizierung, also überschreibe ich auch einige der Funktionen, die standardmäßig die AUTH_USER_MODEL-Variable verwenden. Am Ende kann ich Admin-Modell verwenden, um mich auf der Admin-Seite anzumelden und ein anderes benutzerdefiniertes Benutzermodell zu verwenden, um die Anwendung zu authentifizieren und das JWT-Token zu erhalten. Wie auch immer, referenziere immer diese Seite: https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#customizing-authentication-in-django. Hoffe, das kann dir bei deiner Bewerbung helfen.