为后端的每个用户创建 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 对象的主要内容,如果未能解决你的问题,请参考以下文章