【发布时间】:2021-08-28 00:14:13
【问题描述】:
我创建了自己的用户模型:
class CustomUser(AbstractBaseUser,PermissionsMixin):
phone_number = models.CharField(verbose_name="Mobile Number", max_length=11, unique=True, blank=False, null=False)
security_code = models.IntegerField(verbose_name="Security Code",default=create_security_code)
security_code_creation = models.DateTimeField(auto_now=True)
用户可以使用密码或安全码登录。
我希望它是这样的:
如果用户想使用安全代码登录,我将在我的视图中创建一个随机安全代码。将其发短信给他们,并将安全代码的散列版本保存在我的数据库中。用户从他们收到的文本中输入数字,我将用户输入的哈希版本与我在数据库中的内容进行比较。很像密码。
但我不想将安全代码作为纯文本存储在我的数据库中。我想像密码(散列)一样存储它。
我找到了
from django.contrib.auth.hashers import make_password
我可以使用它来创建安全代码的散列版本。
我的问题是我应该编写一个单独的身份验证后端还是简单地编写/使用像 check_password 这样植入 AbstractBaseUser 的函数?
【问题讨论】:
-
“如果需要,我会给他们发送安全代码”意味着安全代码必须以您可以阅读的方式存储,这样它就不会被散列?
-
我将在我的视图中创建一个随机安全码。发短信给用户。将其保存为散列。它会在一段时间后过期(因此 security_code_creation )
-
为什么要有代码和密码?如果他们必须要求一个代码,为什么不要求一个新密码呢?
-
这在我的国家很普遍。有时用户甚至不会设置密码,而只使用这种方式登录,因为它就像一次性密码一样。
-
覆盖
check_password是一个很好的解决方案,自定义后端通常用于从其他来源进行身份验证