2009-11-03 21 views
7

Potrzebuję stworzyć system uwierzytelniania oparty na poddomenie, taki jak ten 37signals, freshbooks, codebase use. Oznacza to, że każda poddomena mojej głównej aplikacji musi mieć swoją własną nazwę użytkownika. Chciałbym zachować jak najwięcej systemu uwierzytelniania django.Django: jak przechowywać nazwy użytkowników uwierzytelniania oparte na poddomenie?

Jaki jest dobry sposób zapisania nazwy użytkownika?

W szczególności powinno być możliwe, aby różni użytkownicy mieli tę samą nazwę użytkownika, o ile ich konto należy do innej poddomeny.

Niektóre podejścia Mam uznać, za które mogę przewidzieć niedociągnięcia:

  • przechowywania jakiś przedrostek w polu Nazwa modelu użytkownika Django auth.
  • rozszerzenie modelu użytkownika zgodnie z this.
  • dostosowywania źródło auth do moich potrzeb

Odpowiedz

1

myślę, że może to być dobry przypadek użycia za korzystanie django.contrib.sites w połączeniu z drugim punkcie kuli pan wspomniał. Można stworzyć model CustomUser tak:

from django.contrib.sites.models import Site 

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

Następnie można napisać backend niestandardowego uwierzytelniania, aby sprawdzić, że użytkownik może zalogować się na obecnym subdomenie używając podanych parametrów. Dzięki temu możesz mieć jedną nazwę użytkownika dla wielu witryn (subdomen) bez konieczności włamywania się do wewnętrznej aplikacji auth lub przechowywania wielu nazw użytkownika z niestandardowymi przedrostkami.

EDIT: można uzyskać aktualną witrynę za pomocą Site.objects.get_current() a następnie sprawdzić, czy bieżąca strona jest w miejscach użytkownika.

można przeczytać więcej na temat witryn ramach tutaj: http://docs.djangoproject.com/en/dev/ref/contrib/sites/

+0

ale czy nazwy użytkowników nie muszą być unikatowe? –

+0

należy pamiętać, że struktura witryn nie obsługuje wielu witryn z pojedynczego wdrożenia po wyjęciu z pudełka, więc aby emulować świeże książki lub tym podobne, musiałby utworzyć nowy plik ustawień i konfigurację internetową dla każdej witryny ! – easel

+0

@rz - nie można w zasadzie utworzyć jednego CustomUser, a następnie przypisać do nich wiele witryn. @easel - prawda, ale już piszesz projekt oparty na poddomenie, mimo to robisz sporą ilość zautomatyzowanej konfiguracji serwera . nie byłoby zbyt trudno napisać sygnał po zapisaniu, aby dynamicznie generować plik ustawień, który zawiera tylko identyfikator SITE_ID i zmodyfikuje konfigurację serwera/dns. – richleland

2

zbudowałem tę funkcjonalność do kilku miejscach w przeszłości i okazało się, że pierwszy podpunkt jest droga.

Oznacza to, że nie trzeba wprowadzać olbrzymiej zmiany w django auth. To, co zrobiłem, to skonfigurowanie niestandardowego mechanizmu uwierzytelniania, który usuwa sposób zapisywania nazw użytkowników.

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 

dla tego konkretnego projektu Account był model użytkownika i po prostu dziedziczone bezpośrednio od Użytkownika jednak można zastąpić Account o co chcesz.

Musisz zainstalować niestandardowy auth backend w pliku ustawień:

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

Wtedy, kiedy zadzwonić authenticate trzeba przejść w subdomenie, e-mail i hasło.

Można również dodać inne funkcje pomocnicze lub metody modelowania, które pomagają w zapewnieniu, że wyświetlana jest tylko rzeczywista nazwa użytkownika, ale to wszystko jest dość banalne.

Powiązane problemy