2009-11-03 5 views
7

Ich muss ein Sub-Domain-basiertes Authentifizierungssystem, wie das 37signals, freshbooks, codebase verwenden. Das heißt, jede Subdomain meiner Hauptanwendung muss ihren eigenen Benutzernamen-Namespace haben. Ich möchte so viel wie möglich vom Django-Authentifizierungssystem behalten.Django: wie Subdomänen-basierte Authentifizierungs-Benutzernamen gespeichert werden?

Was ist eine gute Möglichkeit, den Benutzernamen zu speichern?

Insbesondere sollte es für verschiedene Benutzer möglich sein, den gleichen Benutzernamen zu haben, solange ihr Konto zu einer anderen Subdomain gehört.

Ich habe einige Ansätze in Betracht gezogen, für die ich Mängel vorhersehen kann:

  • einige Präfix im Feld Benutzername des django Auth Benutzermodell zu speichern.
  • Erweiterung des Benutzermodells nach this.
  • die Quelle Auth auf meine Bedürfnisse Customizing

Antwort

1

denke ich, das ist eine gute Verwendung Fall sein kann django.contrib.sites in Kombination mit dem zweiten Aufzählungszeichen Sie erwähnt für die Verwendung. Sie könnten ein CustomUser Modell wie so erstellen:

from django.contrib.sites.models import Site 

class CustomUser(User): 
    """User with app settings.""" 
    sites = models.ManyToManyField(Site) 

Dann Sie eine eigene Authentifizierungs-Backend schreiben könnte zu prüfen, ob der Benutzer auf die aktuelle Sub-Domain anmelden können Sie die mitgelieferten Anmeldeinformationen. Auf diese Weise können Sie einen Benutzernamen für mehrere Websites (Sub-Domains) verwenden, ohne die interne Authentifizierungs-App hacken oder mehrere Nutzernamen mit benutzerdefinierten Präfixen speichern zu müssen.

BEARBEITEN: Sie können die aktuelle Website mit Site.objects.get_current() abrufen und dann überprüfen, ob die aktuelle Website in den Websites des Benutzers ist.

Sie können hier mehr über die Websites Rahmen lesen: http://docs.djangoproject.com/en/dev/ref/contrib/sites/

+0

aber müssten die Benutzernamen nicht immer eindeutig sein? –

+0

Beachten Sie auch, dass das Site-Framework nicht mehrere Sites einer einzelnen Bereitstellung unterstützt. Um also neue Bücher oder ähnliches zu emulieren, müsste er für jede Site eine neue Einstellungsdatei und Webkonfiguration erstellen ! – easel

+0

@rz - Nein, Sie könnten im Grunde ein CustomUser erstellen und ihnen dann mehrere Sites zuweisen @easel - true, aber Sie schreiben bereits ein Sub-Domain-basiertes Projekt, Sie tun sowieso eine gute Menge an automatisierten Server-Konfiguration . Es wäre nicht schwer, ein Post-Speicher-Signal zu schreiben, um dynamisch eine Einstellungsdatei zu generieren, die nur eine SITE_ID enthält, und Ihre Server-Konfiguration/DNS zu ändern. – richleland

2

ich diese Funktionalität in der Vergangenheit für mehrere Standorte aufgebaut habe, und habe festgestellt, dass Ihr erster Aufzählungspunkt der Weg zu gehen ist.

Es bedeutet, dass Sie keine massive Änderung an Django Auth vornehmen müssen. Was ich getan habe, war ein benutzerdefiniertes Authentifizierungs-Backend eingerichtet, das die Art und Weise abstrahiert, wie Benutzernamen gespeichert werden.

auth_backends.py 

from django.contrib.auth.backends import ModelBackend 

from Home.models import Account 

class CustomUserModelBackend(ModelBackend): 
    def authenticate(self, subdomain, email, password): 
     try: 
      user = Account.objects.get(username=u'%s.%s' % (subdomain, email)) 
      if user.check_password(password): 
       return user 
     except Account.DoesNotExist: 
      return None 

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

Für dieses spezielle Projekt Account war das Benutzermodell und es nur direkt von Benutzern geerbt aber Sie Account mit dem, was Sie wollen, ersetzen könnten.

Sie haben den benutzerdefinierten Authentifizierungs-Backend in Ihrer Einstellungsdatei zu installieren:

AUTHENTICATION_BACKENDS = (
    'auth_backends.CustomUserModelBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

Dann, wenn Sie anrufen authenticate Sie in der Sub-Domain, E-Mail und Passwort übergeben müssen.

Sie können auch einige andere Hilfsfunktionen oder Modellmethoden hinzufügen, die dabei helfen, sicherzustellen, dass nur der tatsächliche Benutzername des Benutzers angezeigt wird, aber das ist alles ziemlich trivial.

Verwandte Themen