【问题标题】:Django Authentication to use both email and usernameDjango Authentication 同时使用电子邮件和用户名
【发布时间】:2021-11-20 06:10:53
【问题描述】:

我的 django-react 应用程序几乎完成了所有模型、序列化程序和 API。但是现在我需要将身份验证方法更改为也使用电子邮件。

class User(AbstractUser):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   email = models.EmailField(unique=True)

   # Notice there is no username field, because it is included in AbstractUser

我查看了一些可能的解决方案,但它们涉及使用 AbstractBaseUser,而其他一些则编写了一个完全省略 用户名 的自定义身份验证后端。这可能会破坏其他视图和前端,因为我们主要使用用户名。

我仍然想保留 用户名 并同时使用 用户名电子邮件 进行身份验证。

有没有什么简单的想法(最好继续使用AbstractUser)我不必进行重大更改?

【问题讨论】:

    标签: django authentication django-rest-framework


    【解决方案1】:

    这段代码摘自《Django 3 by Example》一书,第 4 章,“构建自定义身份验证后端”一节。

    Django 提供了一种简单的方法来定义您自己的身份验证后端。身份验证后端是一个提供以下两种方法的类:authenticate()get_user()

    假设您的项目中有account 应用程序来管理身份验证逻辑。您可以使用以下代码创建authentication.py 文件:

    class EmailAuthBackend(object):
        """
        Authenticate using an e-mail address.
        """
        def authenticate(self, request, username=None, password=None):
            try:
                user = User.objects.get(email=username)
                if user.check_password(password):
                    return user
                return None
            except User.DoesNotExist:
                return None
    
        def get_user(self, user_id):
            try:
                return User.objects.get(pk=user_id)
            except User.DoesNotExist:
                return None
    

    上述代码的工作原理如下:

    • authenticate():您尝试使用给定的电子邮件地址检索用户并使用用户模型的内置 check_password() 方法检查密码。此方法处理密码哈希以将给定密码与存储在数据库中的密码进行比较。
    • get_user():通过user_id参数中提供的ID获取用户。 Django 使用对用户进行身份验证的后端在用户会话期间检索用户对象。

    编辑项目的settings.py 文件并添加以下设置:

    AUTHENTICATION_BACKENDS = [
        'django.contrib.auth.backends.ModelBackend',
        'account.authentication.EmailAuthBackend',
    ]
    

    在上述设置中,您保留用于使用用户名和密码进行身份验证的默认 ModelBackend,并包含您自己的基于电子邮件的身份验证后端。

    Django 将尝试针对每个后端对用户进行身份验证,因此现在您应该能够使用您的用户名或电子邮件帐户无缝登录。将使用ModelBackend 身份验证后端检查用户凭据,如果没有返回用户,将使用您的自定义EmailAuthBackend 后端检查凭据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 2015-04-27
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 2011-09-15
      • 2011-01-07
      相关资源
      最近更新 更多