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的內置模型?
那麼好,如果我理解你正確,創建一個與Django auth User對象一對一的模型,並使用我的身份驗證系統處理特殊的登錄信息?我理解它嗎?上面的代碼究竟做了什麼? (熟悉Python,但不能用'lamda'塊) –
你能否重寫你的答案來演示如何做?這真的很有用,我肯定會給你答案。 –
當然。有一篇老文章可能是一個很好的介紹: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