为后端

时间:2017-12-15 11:31:59

标签: python django

我正在编写自定义后端,用于通过电子邮件地址而非用户名验证用户身份。我已经编写了一个继承自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完全相同,只是电子邮件字段是主键且唯一。

1 个答案:

答案 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模型。但是,正如我已经说过的那样,您实际上并不需要编写自己的身份验证后端。