【问题标题】:Can I use a custom model with Django's authentication system?我可以在 Django 的身份验证系统中使用自定义模型吗?
【发布时间】:2011-11-19 23:12:23
【问题描述】:

我为我的应用程序编写了一个自定义后端,以一种独特的方式处理登录,因为我对这个项目有特定的需求。这是我的后端:

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 django-models django-authentication


    【解决方案1】:

    扩展用户最好使用user profiles。 定义一个用户配置文件模型,并在底部添加如下内容:

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

    我认为这种方法可能比替换用户模型更好

    【讨论】:

    • 那么,如果我理解正确的话,创建一个与 Django auth User 对象一对一的模型,并使用我的身份验证系统来处理特殊的登录内容?我理解对了吗?上面的代码究竟做了什么? (熟悉 Python,但不熟悉 lamda 块)
    • 您能否重写您的答案以确切说明该怎么做?这将非常有帮助,我肯定会奖励你的答案。
    • 当然。有一篇旧文章可能是一个很好的介绍:b-list.org/weblog/2006/jun/06/django-tips-extending-user-model 另外,请参阅 django 文档中的部分:docs.djangoproject.com/en/dev/topics/auth/…。我的示例将“配置文件”属性添加到用户类;通过这种方式,您可以通过“u = User.objects...()”和“u.profile”之类的方式轻松获取配置文件。如果配置文件不存在,它会创建它(参见 get_or_create() 文档)。
    • 这适用于访问您的模型,但它会在 每个 访问时进行请求,这对性能不利,并且您无法在内存中对其进行修改。
    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 2020-07-03
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多