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