2012-12-19 39 views
7

Tôi muốn tạo một chương trình phụ trợ xác thực cho phép người dùng đăng nhập chỉ bằng email của họ (không có tên người dùng, không có mật khẩu).Phụ trợ xác thực tùy chỉnh. Django

Đây là những gì tôi đã thử.

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> 

xem:

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')) 

Nó không hoạt động, người dùng không được xác thực. Và tôi cũng gặp lỗi này khi tôi truy cập vào/admin:

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

Trả lời

11

Đối với mỗi phụ trợ tùy chỉnh ở Django, bạn cần chỉ định hàm get_user. Xem the documentation. Việc thực hiện get_user chỉ đơn giản là có thể sử dụng bảng tài khoản hiện có, như bạn là:

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

Lý do này được yêu cầu là cho tình huống mà bạn sẽ cần phải lấy tài khoản qua khóa chính của nó từ một nguồn khác nhau.

+0

CẢM ƠN BẠN. Tôi chấp nhận câu trả lời càng sớm càng tốt. – Marcolac

2

Trong khi câu trả lời được chấp nhận là câu trả lời đúng, tôi sẽ chỉ cung cấp ví dụ về cách khác để giải quyết vấn đề bằng cách kế thừa ModelBackend.

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 đã được ModelBackend triển khai và bạn nhận được các phương pháp cho phép cùng với nó.

Các vấn đề liên quan