2012-03-05 37 views
3

我有我写了别的一个Python库。所以我导入在Django中使用,我面对的问题是如何获取密码。如何在django中获取密码?

mycustom_lib_function(username, password) 

username我可以通过request.user

在通不过,我不知道如何获取密码。有人能帮我吗?谢谢。

回答

2

你的功能mycustom_lib_function不应该使用明文密码。在用户与应用程序进行身份验证,你有一个User对象(从django.contrib.auth.models),其中包含一个哈希密码:

>>> user.username 
u'myusername' 
>>> user.password 
u'sha1$98ffc$b5fd085b8bc1c05fd241dfc97230631926141fe7' 

键入到表单中的实际密码不存储明文,作为标准的Web安全建议您不要在认证之后存储密码的纯文本值。
需要注意的是,你可以通过执行检查上述哈希:

>>> from hashlib import sha1 
>>> password = 'weak_password' 
>>> _, salt, hashpw = user.password.split('$') 
>>> sha1(salt+password).hexdigest() == hashpw 
True 

现在,如果你的应用包装成你不用管,需要密码才能做某些动作的另一个应用程序,你都不可能考虑存储密码明文(或稍微好一点的加密),但django.contrib.auth不会为你做这个。如果您设置了OAuth类型的凭证系统会更好,该凭证系统完全可以执行此功能,而不需要用户向中间站点显示其密码。

如果你做控制的应用程序,我将放弃要求输入密码才能被传递给它。

+0

我无法控制它。该库用于远程存储库控制(hg,git),因此需要用户名和密码才能调用它。这与django登录基本相同)。所以想想一个实现“克隆库”的函数。该函数将url,用户名,密码和克隆到本地磁盘。是。该函数接收明文密码。所以我们不能通过Django解密这个密码? THanks – user1012451 2012-03-05 19:02:18

+0

嗯,我设计了图书馆。所以现在我要输入用户名和密码,这是你观察到的明文。但我不认为我可以将哈希传入这些远程存储库进行身份验证。 – user1012451 2012-03-05 19:08:25

+0

@anotheruser是的,你不能通过django“解密”散列密码。 (哈希是一种单向函数,不是真正的加密)。您可以在创建用户帐户时以明文形式将用户的密码保存在数据库中。请参阅:http://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django您应该向用户明确说明您以明文存储密码。另一种可能性是你跟踪你的应用程序中的权限,并在git/hg repos中为用户创建一个用户'django'的帐户,该帐户为用户执行操作。 – 2012-03-05 19:12:00

10

User的密码散列,所以你不能得到它。询问用户。

+11

+1 '询问用户' – 2012-03-05 18:18:09

+0

感谢。你是说用户必须手动输入密码吗?我看着'User' API,不太清楚怎样才能解决这个问题。 – user1012451 2012-03-05 18:18:39

+0

我的意思正是我写的。 – 2012-03-05 18:22:29

1

您可以在技术上的密码存储为纯文本,但它不是从安全的立场八邑权,见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功能。