如何在没有User对象的情况下存储Django哈希密码?

时间:2014-08-02 19:09:29

标签: django passwords

我有一个Django应用程序,允许网站访问者创建自己的帐户。一旦他们使用密码创建帐户,他们就会收到包含激活码的电子邮件。当网络访问者创建新帐户时,他们需要接收包含唯一密钥的激活电子邮件。

显然,我可以使用Django的内置身份验证系统完成所有这些工作。我之前没有遇到任何问题。但是,在此应用程序中,我不想使用非活动用户污染我的Users表。我只希望激活的用户出现在Users表中。因此,尽管我将使用Django的帐户系统对激活的用户进行身份验证,但在激活用户之前,我将使用自己的系统。我将关于尚未激活的用户的所有数据保存在单独的Django Model对象(称为UserActivation)中。我将自己管理发送激活邮件。

我遇到的问题是我不想以纯文本格式存储用户提交的密码。我想将它存储在我的UserActivation对象中,该字段名为" password"它将以相同的散列格式出现在User表中。要把它放到用户对象中,我会做myUser.set_password("plainTextPassword")。如何获得相同的值并将其填入UserActivation.password

通过查看this doc,似乎有一个make_password()函数可以返回我需要的值。但我仍然需要一个User对象来调用该方法。如何在不通过User对象的情况下将"plainTextPassword"转换为哈希密码?

3 个答案:

答案 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()