【发布时间】:2012-03-23 05:14:50
【问题描述】:
我有一个 python 库,我为其他东西编写了它。所以我导入它以在 Django 中使用,我面临的问题是如何获取密码。
mycustom_lib_function(username, password)
username我可以通过request.user进入
但是,我不确定如何获取密码。有人能帮我吗?谢谢。
【问题讨论】:
标签: django
我有一个 python 库,我为其他东西编写了它。所以我导入它以在 Django 中使用,我面临的问题是如何获取密码。
mycustom_lib_function(username, password)
username我可以通过request.user进入
但是,我不确定如何获取密码。有人能帮我吗?谢谢。
【问题讨论】:
标签: django
User 中的密码是经过哈希处理的,因此您无法获取它。询问用户。
【讨论】:
User API,不太确定如何通过。
从技术上讲,您可以将密码存储为纯文本,但从安全角度来看这是不对的,请参阅this answer,强烈不推荐! django.contrib.auth.hashers 有一些很好的密码工具,请参阅the official Django docs。
如果您知道纯文本密码可能是什么,即我的一个应用程序中有一个全局存储的默认密码,该密码以纯文本形式存储,如下例所示。要检查用户的密码是否设置为默认密码,您可以使用 check_password 函数,如果纯文本与编码密码匹配,该函数将返回 True:
from django.contrib.auth.hashers import check_password
from django.contrib.auth.models import User
u = User.objects.all().first()
if check_password('the default password', u.password):
print 'user password matches default password'
else:
print 'user a set custom password'
另请参阅 is_password_usable 和 make_password 函数。
【讨论】:
您的函数mycustom_lib_function 不应使用明文密码。在用户通过您的应用程序进行身份验证后,您将拥有一个包含哈希密码的 User 对象(来自 django.contrib.auth.models):
>>> user.username
u'myusername'
>>> user.password
u'sha1$98ffc$b5fd085b8bc1c05fd241dfc97230631926141fe7'
输入表单的实际密码不会以明文形式存储,因为标准网络安全建议您不要在身份验证后存储明文密码值。
请注意,您可以通过执行以下操作来检查上述哈希:
>>> from hashlib import sha1
>>> password = 'weak_password'
>>> _, salt, hashpw = user.password.split('$')
>>> sha1(salt+password).hexdigest() == hashpw
True
现在,如果您的应用程序包含在您无法控制的另一个应用程序中,该应用程序需要密码才能执行某些操作,您可以考虑以明文形式存储其密码(或稍微更好地对其进行加密),但django.contrib.auth 不会这样做为你。如果您设置一个 OAuth 类型的凭据系统会更好,该系统完全可以执行此功能,而无需用户向中间站点透露他们的密码。
如果它是您控制的应用程序,我会放弃将密码传递给它的要求。
【讨论】:
django 创建一个帐户,该帐户为用户执行操作。