【问题标题】:Django custom User model authenticationDjango 自定义用户模型认证
【发布时间】:2012-05-05 23:12:25
【问题描述】:

由于我没有使用来自 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

如果我想使用我的 CustomUser,是否需要导入 Django 用户?

我找不到一个很好的教程来解释如何在没有标准身份验证用户的情况下使用 Django。

*编辑: 我知道我可以与用户一起扩展。但我就是不想那样。问题不在于:使用用户和存储附加信息等的最佳方式是什么。不过我很感激。 但是我如何在不使用身份验证用户的情况下使用自定义用户。即使我没有理由这样做。 *

如果可能的话,我想知道怎么做。

【问题讨论】:

  • “使用自定义用户”是什么意思?你能使用login_required 装饰器吗?是的,如果您的 CustomUser 提供了 is_authenticated 方法,那就不要过分。你能使用权限吗?不,等等。您想使用 Django 身份验证系统的哪个部分?
  • 通常你会使用 Auth User 来创建用户。如上所示,我使用 CustomUser 创建用户。我想使用 login_required 和 is_authenticated。没有权限。
  • 我一直在疯狂地试图自己回答这个问题。我需要身份验证用户和自定义“身份验证帐户”。我听到每个人都说“把它塞到用户表中并设置一个“帐户”组”,但我不希望这样。 @nelsonvarela 你怎么了?你找到你想要的答案了吗?
  • @nelsonvarela 到目前为止,您是否找到了这个问题的正确答案。如果是,请帮助我解决同样的问题

标签: django django-admin django-authentication


【解决方案1】:

也许这回答了你的问题:

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

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

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

AUTH_USER_MODEL = 'myapp.MyUser' 这对虚线描述了 Django 应用程序的名称(必须在您的 INSTALLED_APPS 中),以及您希望用作用户模型的 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

我希望这可以帮助任何其他需要不同用户和设备身份验证方案的迷失者(可能是因为一些预先存在的规范使本来可以很容易的事情变得混乱)。

干杯!

【讨论】:

    【解决方案2】:

    看看这篇文章。

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

    如果您使用修订版 7477(2008 年 4 月 26 日)的主干,您的模型类可以从现有模型类继承。附加字段存储在一个单独的表中,该表链接到基本模型的表。当您检索模型时,查询会使用连接从模型和基本模型中获取字段。

    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/

    【讨论】:

    • 您可以引用链接的一些要点,在人们点击链接之前向他们展示它是什么。
    【解决方案3】:

    整个 Django 身份验证系统与django.contrib.auth.models.User 紧密耦合,因此您应该在后端使用它。引用Django docs

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

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

    【讨论】:

    • 我没有特殊原因。我只是想知道我该怎么做
    • 我能想到的一个用例是设备身份验证。我可能有一项服务需要对设备和用户进行身份验证。
    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多