Django自定义用户模型认证

4

由于我没有使用Django的Auth User,而是有自己的模型CustomUser,我希望通过这个模型进行站点认证(CustomUser不继承User模型并且与其没有关联)。

class CustomUser(models.Model):
    password = models.CharField(max_length = 40)
    email = models.EmailField(max_length = 72, unique = True)
    #stuff...

我查看了https://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend,但我不理解的主要问题是:
from django.contrib.auth.models import User

我想使用自定义用户,是否需要导入Django User?
我找不到一个好的教程来解释如何在Django中不使用标准的Auth User。
*编辑: 我知道可以通过扩展User实现。 但我不想这样做。问题不是:如何最好地使用User并存储其他信息等等。 虽然我很感激这些建议。 而是如何在不使用Auth User的情况下使用自定义用户。 即使我没有理由也想知道如何做到这一点。*
如果可能的话,我想知道如何实现。

“使用自定义用户”是什么意思?您能使用login_required装饰器吗?如果您的“CustomUser”提供了“is_authenticated”方法,那么可以,否则不行。您能使用权限吗?不行。等等。您想使用Django身份验证系统的哪一部分? - DrTyrsa
通常情况下,您会使用Auth User来创建用户。我使用CustomUser来创建用户,如上所示。我想使用login_required和is_authenticated。没有权限。 - nelsonvarela
我一直在试图自己解决这个问题,但让我感到疯狂。我既需要Auth用户,也需要自定义的“Auth账户”。我听到每个人都说“将其放入User表中,并设置一个'Account'组”,但我不想这样做。@nelsonvarela,你怎么了?你找到了你要找的答案吗? - e.thompsy
@nelsonvarela,你现在找到了这个问题的正确答案吗?如果是的话,请帮助我解决同样的问题。 - Cp Verma
3个回答

1
整个Django认证系统与django.contrib.auth.models.User紧密耦合,因此您应该在后端中使用它。引用Django文档

目前,处理这个问题的最佳方法是为后端中存在的每个用户创建一个Django用户对象

但是这里的主要问题是:您的CustomUser有什么特别之处,不能使用普通的User模型(可以扩展)来实现?在99%的情况下,使用User是最好的方法。

1
我没有特别的理由,只是想知道我该如何做到这一点。 - nelsonvarela
2
我能想到的一个用例是设备认证。我可能有一个需要对设备和用户进行身份验证的服务。 - Erik

0

也许这可以回答你的问题:

来自'https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#substituting-a-custom-user-model':

替换自定义用户模型 Django 1.5中新增。 某些项目可能具有身份验证要求,Django内置的User模型并不总是适用。例如,在某些网站上,使用电子邮件地址作为标识令牌比使用用户名更有意义。

Django允许您通过提供引用自定义模型的AUTH_USER_MODEL设置的值来覆盖默认的User模型:

AUTH_USER_MODEL = 'myapp.MyUser' 这个点对描述了Django应用程序的名称(必须在您的INSTALLED_APPS中),以及您希望用作User模型的Django模型的名称。

当然,需要考虑一些必要的警告(在上面的链接中提供),但这似乎是对你的问题一个很好的答案:https://docs.djangoproject.com/en/1.6/ref/settings/#auth-user-model

还有一些自定义模型的合规性期望需要考虑(太多了,无法在此列出):https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#specifying-a-custom-user-model

除非AUTH_USER_MODEL可以有多个值(我认为这不是明智的选择),否则我认为我需要构建自己的自定义身份验证后端:https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#writing-an-authentication-backend

我希望这能帮助其他需要不同用户和设备身份验证方案的迷失灵魂(也许是因为某些现有规范使得本来可以变得如此简单的事情变得混乱)。

干杯!


0

看看这篇文章。

我所做的大多数Django项目都需要存储有关每个用户的信息,除了contrib.auth.models.User模型保存的标准名称和电子邮件地址之外。

如果您使用的是截至2008年4月26日的修订版7477(即trunk),则您的模型类可以继承现有的模型类。附加字段存储在与基本模型表相链接的单独表中。当您检索模型时,查询使用连接从中获取其字段和基本模型的字段。

http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

还有这篇文章。

将 auth 应用程序复制到自己的项目中,并根据需要进行修改。这样可以避免一些维护问题,但会消除 Django 打包认证系统的实用性。同时,这也可能导致与其他应用程序的兼容性问题,因为它们期望 User 模型在 django.contrib.auth 中。

http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/


在人们点击链接之前,您可以引用一些重要的链接内容以向他们展示它是什么。 - okm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接