2011-09-19 42 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

相关问题