2012-12-19 29 views
7

Kullanıcıların yalnızca e-postalarını (kullanıcı adı, parola yok) kullanarak oturum açmalarına izin veren bir kimlik doğrulama arka planı oluşturmak istiyorum.Özel kimlik doğrulama arka sonu. Django

İşte denedim.

backends.py:

from django.conf import settings 
from django.contrib.auth.models import User 

class EmailAuthBackend(object):  
    def authenticate(self, username=None, password=None): 
     try: 
      user = User.objects.get(email=username) 
      if user: 
       return user 
     except User.DoesNotExist: 
      return None 

settings.py:

AUTHENTICATION_BACKENDS = (
     'path_to.backends.EmailAuthBackend', 
     'django.contrib.auth.backends.ModelBackend', 
    ) 

html:

<form method="post" action="{% url myproject.views.test %}"> 
    {% csrf_token %} 

     <input type="text" name="email" value=""/> 

    <button type="submit">Valider</button> 

    </form> 

görünüşüdür:

def test(request): 
    email = '' 
    if 'email' in request.POST: 
     email = request.POST.get('email') 
     if not User.objects.filter(email=email): 
      User.objects.create(email=email) 
     user = authenticate(username=email) 
     if user is not None: 
      if user.is_active: 
       auth_login(request, user) 
    return HttpResponseRedirect(reverse('home')) 

Çalışmıyor, kullanıcının kimliği doğrulanmamış. G/yönetici gittiğinde ben de bu hata var:

AttributeError at /admin/logout/ 
    'EmailAuthBackend' object has no attribute 'get_user' 

cevap

11

Django her bir özel arka uç için, get_user fonksiyonunu belirtmeniz gerekir. Bakınız the documentation. Bu gereklidir

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

nedeni farklı bir kaynaktan birincil tuşu aracılığıyla kullanıcı getirmesi gerekiyordu durumlar içindir: senin gibi get_user uygulama basitçe, varolan Kullanıcı tabloyu kullanabilirsiniz.

+0

TEŞEKKÜRLER. En kısa zamanda cevabı kabul ediyorum. – Marcolac

2

Kabul edilen cevap doğru olsa da, ModelBackend'i miras alarak sorunu çözmek için başka bir yol göstereceğim.

from django.contrib.auth.backends import ModelBackend 

class EmailAuthBackend(ModelBackend): 
    def authenticate(self, username=None, password=None, **kwargs): 
     try: 
      user = User.objects.get(email=username) 
      if user.check_password(password): 
       return user 
     except ObjectDoesNotExist: 
      # Run the default password hasher once to reduce the timing 
      # difference between an existing and a non-existing user (#20760). 
      User().set_password(password) 

get_user

zaten ModelBackend tarafından uygulanan ve onunla birlikte izin yöntemlerini olsun.

İlgili konular