2011-09-19 12 views
2

我爲我的應用程序編寫了一個自定義後端,以一種獨特的方式處理登錄,因爲我對此項目有特定需求。這裏是我的後端:我可以在Django的身份驗證系統中使用自定義模型嗎?

from my.project.models import User 
from hashlib import sha512 

class MyBackend: 

    def authenticate(self, email_address=None, password=None): 
     print "Trying to auth: " + email_address 

     try: 
      user = User.objects.get(email_address=email_address) 
      password = sha512(password + user.password_salt).hexdigest() 

      if user.password != password: 
       return None 
      else: 
       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 

這裏是我的User類:

class User(models.Model): 
    email_address = models.EmailAddressField() 
    password = models.CharField(max_length=128) 
    password_salt = models.CharField(max_length=128) 

這很簡單,但我已經建立了我的模型的其餘部分解決這個「用戶」類。

有沒有一種方法可以使這項工作成爲兩全其美的方法,還是應該放棄這種方法,並且只爲用戶使用Django的內置模型?

回答

2

擴展用戶最好通過使用user profiles來完成。 定義用戶配置文件模型,並在底部,添加這樣的事情:

User.profile = property(lambda u: Profile.objects.get_or_create(user=u)[0]) 

我覺得這個方法可能比免去用戶模型

+0

那麼好,如果我理解你正確,創建一個與Django auth User對象一對一的模型,並使用我的身份驗證系統處理特殊的登錄信息?我理解它嗎?上面的代碼究竟做了什麼? (熟悉Python,但不能用'lamda'塊) –

+0

你能否重寫你的答案來演示如何做?這真的很有用,我肯定會給你答案。 –

+0

當然。有一篇老文章可能是一個很好的介紹:http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/此外,請參閱django中的部分文檔:https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users。我的示例將「profile」屬性添加到User-class;通過這種方式,您可以通過「u = User.objects ...()」和「u.profile」等簡單的方式獲取配置文件。如果配置文件不存在,它會創建它(請參閱get_or_create() - 文檔)。 – schneck

相關問題