2013-06-12 12 views
9

Potrzebujesz poważnej pomocy tutaj.Backend wielokrotnego uwierzytelniania Django dla jednego projektu, JAK?

Mam aplikację napisaną w django/python i muszę ją rozszerzyć i uwzględnić inne rozwiązanie jako "aplikację" w tej aplikacji. Na przykład moja aplikacja do zintegrowania nazywa się "my_new_app" Teraz jest zapisane uwierzytelnianie backendu dla głównej aplikacji i nie mogę z niego korzystać. Mam mysql db do kwerendy od i główna aplikacja używa głównie cassendra i redis. Moje pytanie brzmi: czy jest jakiś sposób wykorzystania osobnego mechanizmu uwierzytelniania dla nowej aplikacji "my_new_app" i uruchomienia obu w tej samej domenie? Pytanie może nie być takie jasne, wyjaśnię, jeśli zapytam.

Odpowiedz

24

Możesz może mieć wiele kopii zapasowych uwierzytelniania. Po prostu ustaw AUTHENTICATION_BACKENDS w settings.py swojego projektu Django, aby wyświetlić listę implementacji backendu, którego chcesz użyć. Na przykład często używam kombinacji uwierzytelniania OpenID i standardowego uwierzytelniania Django, jak to w moim settings.py:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'django_openid_auth.auth.OpenIDBackend', 
    ) 

W tym przykładzie Django spróbuje najpierw do uwierzytelniania przy użyciu django.contrib.auth.backends.ModelBackend, który jest domyślnym backend Django. Jeśli to się nie powiedzie, przejdzie do następnego zaplecza, django_openid_auth.auth.OpenIDBackend.

Pamiętaj, że niestandardowe backendy muszą znajdować się na ścieżce widocznej w Django. W tym przykładzie muszę dodać django_openid_auth do INSTALLED_APPS, w przeciwnym razie Django nie będzie mógł go zaimportować i użyć go jako zaplecza.

przeczytać również odpowiednią dokumentację, to bardzo ładnie napisany, łatwy do zrozumienia: https://docs.djangoproject.com/en/dev/topics/auth/customizing/

4

byłem przez ten problem wcześniej. To jest kod, którego użyłem.

To backend uwierzytelniania w API/backend.py

from django.contrib.auth.models import User 


class EmailOrUsernameModelBackend(object): 

    def authenticate(self, username=None, password=None): 
     if '@' in username: 
      kwargs = {'email': username} 
     else: 
      kwargs = {'username': username} 
     try: 
      user = User.objects.get(**kwargs) 
      if user.check_password(password): 
       return user 
     except User.DoesNotExist: 
      return None 

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

A to moja settings.py

AUTHENTICATION_BACKENDS = (
    'api.backend.EmailOrUsernameModelBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

Nadzieję, że to pomaga. Proszę, powiedz mi, jeśli nadal masz kłopoty. Ten kod pozwoli ci użyć poczty e-mail do uwierzytelnienia domyślnego użytkownika Django nawet w administratorze Django.

+0

Chociaż twoje rozwiązanie jest dobre, ale nie odpowiada dokładnie temu, czego chcę, opublikuję rozwiązanie w ciągu kilku godzin. BTW Mam pomysł z twojego rozwiązania, więc tutaj jest +1 do ciebie. –

+0

Użycie 'if '@' w nazwie użytkownika:' do określenia, czy nazwa użytkownika jest e-mailem, jest dość złym sposobem na osiągnięcie tego, jeśli nazwy użytkownika mogą zawierać '@ '.Powinieneś przynajmniej użyć dopasowania do wzorca lub zidentyfikować wybraną opcję u źródła. – vintagexav

+1

Zamiast 'jeśli '@' w nazwie użytkownika:', użyj 'django.core.validators.validate_email' tak: ' def validateEmail (e-mail): try: validate_email (e-mail) return true wyjątkiem ValidationError: return False'y –

2

Korzystanie z wielu uwierzytelnień backendu jest tak proste jak ciasto. Musisz tylko zrozumieć przepływ pracy aplikacji Django.

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.Backend1', 
    'django_openid_auth.auth.Backend2', 
    ) 

Na przykład zdefiniowano następujące dwa backendy. Django najpierw przejdzie do pierwszego backendu i wystarczy umieścić logikę w tym backendcie, aby, jeśli nie jest on powiązany z tym backendem, został przekazany do drugiego backendu lub zwrócony bez żadnych rezultatów. W przypadku braku wyników django automatycznie przeniesie żądanie z pierwszego backendu do drugiego i jeśli jest dostępny trzeci. Spędzam na tym dużo czasu i dowiedziałem się, że to nie było takie skomplikowane.

+0

Nie rozumiem, dlaczego napisałeś odpowiedź, która jest prawie taka sama jak moja, wysłana 2 tygodnie wcześniej ... :( – janos

+0

Właściwie to nie dostałem dokładnie tego, co chciałeś powiedzieć, więc podążyłem za twoim odpowiedzieć i zrobił trochę magii mojej własnej i Volla.Twoja odpowiedź jest dobra.Jeśli przyłączyć się do obu naszych odpowiedzi i umieścić jeden więcej na dole to byłoby najlepszą odpowiedzią na ten problem. Powodzenia –

+0

Możesz rzucić mi komentarz , Ja bym to wyjaśnił ;-) Wyjaśniłem to teraz, co myślisz? Daj mi znać, jeśli nadal uważasz, że powinna zostać zmieniona. – janos

Powiązane problemy