2013-02-12 38 views
0

我正在使用Django 1.5。我的用戶模型是:無法在Django中使用正確的用戶名和密碼進行身份驗證?

class User(AbstractBaseUser): 
    #id = models.IntegerField(primary_key=True) 
    #identifier = models.CharField(max_length=40, unique=True, db_index=True) 
    username = models.CharField(max_length=90, unique=True, db_index=True) 
    create_time = models.DateTimeField(null=True, blank=True) 
    update_time = models.DateTimeField(null=True, blank=True) 
    email = models.CharField(max_length=225) 
    #password = models.CharField(max_length=120) 
    external = models.IntegerField(null=True, blank=True) 
    deleted = models.IntegerField(null=True, blank=True) 
    purged = models.IntegerField(null=True, blank=True) 
    form_values_id = models.IntegerField(null=True, blank=True) 
    disk_usage = models.DecimalField(null=True, max_digits=16, decimal_places=0, blank=True) 
    #last_login = models.DateTimeField() 

    objects = UserManager() 
    USERNAME_FIELD = 'username' 
    class Meta: 
     db_table = u'galaxy_user' 

我無法使用正確的用戶名和密碼進行身份驗證。 我的登錄機制是:

def login_backend(request): 
    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      login(request, user) 
      return HttpResponseRedirect('/overview/') 
     else: 
      return HttpResponseRedirect('/login_backend/') 
    else: 
     return render_to_response('login_backend.html', context_instance=RequestContext(request)) 

我在做什麼錯?

+0

我所要做的,現在呢? – pynovice 2013-02-12 11:04:03

+0

我也這麼做。我認爲用戶名不會影響它。 – pynovice 2013-02-14 06:38:20

+0

我認爲這將是編寫自定義身份驗證Backend的最佳方式,而不是使用Django的測試版來使用此功能rite? – pynovice 2013-02-14 09:04:43

回答

0

首先更新您的用戶模型,它沒有密碼。你的電子郵件字段不是charfield,我認爲它是EmailField,你的密碼也不是charfield。請搜索正確的字段。密碼必須是哈希...

backend.py

from django.conf import settings 
from app_name.models import User 

class AuthBackend: 
    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 

創建「check_password」通過借鑑作用。這種檢查的方式是,在將輸入密碼與保存在數據庫中的密碼進行比較之前,必須先輸入密碼。

更新settings.py

AUTHENTICATION_BACKENDS = (
    'app_name.backend.AuthBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 
+0

這很好,但我在哪裏可以得到check_password()? – pynovice 2013-02-15 06:47:31

+0

創建一個「check_password」查看功能,用於檢查輸入的密碼 – catherine 2013-02-15 07:03:25

+0

爲我提供示例。 – pynovice 2013-02-15 07:22:28

相關問題