我正在编写自定义后端,用于通过电子邮件地址而非用户名验证用户身份。我已经编写了一个继承自AbstractUser
的自定义用户模型:
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管理员与Django User对象紧密耦合。该 处理这个的最好方法是为每个创建一个Django User对象 用于后端的用户(例如,在您的LDAP目录中,您的 外部SQL数据库等)您可以编写脚本来执行此操作 提前,或者你的身份验证方法可以在第一次做到 用户登录。
它说我应该为我后端的用户创建一个Django User对象(我猜是默认的User对象django.contrib.auth.models.User)。
问题1:如果后端是实现get_user(user_id)
和authenticate(request, **credentials)
的类(在docs中说明),后端如何包含用户?什么是" 用户在我的后端"?
问题2:如果我的cutom用户对象是AbstractUser
的子类,我是否真的必须创建一个普通的Django User对象?它们与django.contrib.auth.models.User
完全相同,只是电子邮件字段是主键且唯一。
答案 0 :(得分:2)
如果您的自定义模型有SELECT tt.userId, tt.UserName, ad.*,
(CASE WHEN tt.EmailAddress = @EmailAddress THEN 1
WHEN tt.LastName = @LastName AND tt.BirthDate = @DOB THEN 2
END) as [Rank]
FROM Users.User tt LEFT JOIN
General.[Address] ad
ON tt.AddressId = ad.AddressId
WHERE (tt.EmailAddress = @EmailAddress) OR
(tt.LastName = @LastName AND tt.BirthDate = @DOB);
,那么您就不必编写自定义身份验证后端。默认ModelBackend
将处理使用电子邮件登录。
当Django在后端讨论用户时,它表示包含这些用途的LDAP目录或外部数据库,而不是访问这些用户的backend class。如果您有自定义用户模型,则USERNAME_FIELD = 'email'
模型应返回该模型,而不是get_user
模型。但是,正如我已经说过的那样,您实际上并不需要编写自己的身份验证后端。