为后端的每个用户创建 Django User 对象

Posted

技术标签:

【中文标题】为后端的每个用户创建 Django User 对象【英文标题】:Creating Django User object for each user in backend 【发布时间】:2017-12-15 11:31:59 【问题描述】:

我正在编写一个自定义后端,用于通过电子邮件地址而不是用户名对用户进行身份验证。我已经编写了一个继承自 AbstractUser 的自定义 User 模型:

class User(AbstractUser):
    email = models.EmailField(
        _('email address'),
        max_length=150,
        unique=True,
        primary_key=True,
        help_text=_('Required. 150 characters of fewer. Must be a valid email address.'),
        error_messages=
            'unique':_("A user with that email address already exists."),
        ,
    )

如您所见,我已将电子邮件字段设置为唯一的,并且还设置了主键。

我正在关注如何编写后端的文档,并且我已经阅读了以下内容:

Django admin 与 Django User 对象紧密耦合。这 处理这个问题的最好方法是为每个创建一个 Django User 对象 您的后端存在的用户(例如,在您的 LDAP 目录中,您的 外部 SQL 数据库等)您可以编写脚本来执行此操作 提前,或者您的身份验证方法可以在第一次 用户登录。

它说我应该为我的后端中的每个用户创建一个 Django User 对象(我猜这是默认的 User 对象 django.contrib.auth.models.User)。。 p>

问题一:如果后端是一个实现get_user(user_id)authenticate(request, **credentials)的类(docs里有说),后端怎么能包含用户呢? “我的后端用户”是什么意思?

问题2:如果我的cutsom用户对象是AbstractUser的子类,我真的必须创建一个普通的Django用户对象吗?它们与django.contrib.auth.models.User 几乎相同,只是电子邮件字段是主键且唯一。

【问题讨论】:

您只需要一个自定义身份验证后端,而不是整个模型。参考***.com/a/37332393/7654934。 email 字段绝对应该是唯一的,如果您想使用它来登录,但您可能需要重新考虑使用它作为primary_key。这可能会使用户更改电子邮件地址变得棘手。 默认的身份验证后端支持使用USERNAME_FIELD = 'email' 的自定义用户模型。我会这样做,然后就不需要自定义身份验证后端了。 Alasdair,文档中的示例不是比 Ivanov 链接到的上一个问题困难几个数量级吗? 我可能不应该链接到that example,我现在已经从我的答案中删除了它。该示例使用AbstractBaseUser,而不是BaseUser,因此需要更多代码。请参阅@N.Ivanov 链接到的问题的this other 答案。 【参考方案1】:

如果您的自定义模型有USERNAME_FIELD = 'email',那么您不必编写自定义身份验证后端。默认ModelBackend 将处理使用电子邮件登录。

当 Django 在您的后端谈论用户时,它指的是包含这些用途的 LDAP 目录或外部数据库,而不是访问这些用途的您的 backend class。如果您有自定义用户模型,则 get_user 模型应该返回它,而不是 User 模型。但是,正如我已经说过的,听起来您实际上不需要编写自己的身份验证后端。

【讨论】:

以上是关于为后端的每个用户创建 Django User 对象的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 嵌套对象使用 request.user 创建

Django-User

Django月度用户帐单记录

您自己的用户模型的 Django 每个对象权限

如何在django创建模板中创建对象时自动插入当前用户?

Django REST 框架:使用相关字段创建/更新对象