我有一个Django应用程序,允许网站访问者创建自己的帐户。一旦他们使用密码创建帐户,他们就会收到包含激活码的电子邮件。当网络访问者创建新帐户时,他们需要接收包含唯一密钥的激活电子邮件。
显然,我可以使用Django的内置身份验证系统完成所有这些工作。我之前没有遇到任何问题。但是,在此应用程序中,我不想使用非活动用户污染我的Users表。我只希望激活的用户出现在Users表中。因此,尽管我将使用Django的帐户系统对激活的用户进行身份验证,但在激活用户之前,我将使用自己的系统。我将关于尚未激活的用户的所有数据保存在单独的Django Model对象(称为UserActivation
)中。我将自己管理发送激活邮件。
我遇到的问题是我不想以纯文本格式存储用户提交的密码。我想将它存储在我的UserActivation对象中,该字段名为" password"它将以相同的散列格式出现在User表中。要把它放到用户对象中,我会做myUser.set_password("plainTextPassword")
。如何获得相同的值并将其填入UserActivation.password
?
通过查看this doc,似乎有一个make_password()
函数可以返回我需要的值。但我仍然需要一个User对象来调用该方法。如何在不通过User对象的情况下将"plainTextPassword"
转换为哈希密码?
答案 0 :(得分:14)
你走在正确的轨道上。但是,您可以使用
手动管理密码from django.contrib.auth.hashers import make_password
print "Hashed password is:", make_password("plain_text")
Hasher配置将由PASSWORD_HASHERS驱动,这对于auth系统和UserActivation模型都应该是通用的。但是,您也可以使用make_password
方法传递它。
PASSWORD_HASHERS = (
'myproject.hashers.MyPBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
)
希望这有帮助。
阅读此链接了解更多详情: https://docs.djangoproject.com/en/dev/topics/auth/passwords/
答案 1 :(得分:7)
接受的答案对我有帮助 - 我只想添加check_password电话(对于像我这样的人,以前没有使用过此功能)
from django.contrib.auth.hashers import make_password, check_password
hashed_pwd = make_password("plain_text")
check_password("plain_text",hashed_pwd) # returns True
答案 2 :(得分:0)
我最近通过执行以下步骤解决了这个问题:
from .models import Client
from django.contrib.auth.hashers import make_password
from .forms import ClientForm
form = ClientForm(request.POST)
if form.is_valid():
first_name = form.cleaned_data['first_name']
family_name = form.cleaned_data['family_name']
password = make_password(form.cleaned_data['password'])
phone = form.cleaned_data['phone']
user = Client(first_name=first_name, family_name=family_name, password=password, phone=phone)
user.save()