我正在openx(在django上运行)上工作,用户将从其他站点重定向到这里,并且从那里向我提供哈希密码。 验证(用户名,密码)除了像“dragon”这样的原始密码而不是散列密码,
所以我需要使用带有哈希密码的authenticate(),这样我就可以获得“.backend”属性并继续我的生活。
当我使用login(request,user)
而不使用authenticate方法时。出现此错误:
request.session[BACKEND_SESSION_KEY] = user.backend
AttributeError: 'User' object has no attribute 'backend'
所以我需要使用验证函数来获取用户对象中的 .backend 属性。
user =authenticate(username=username,password=password)
是authenticate函数的格式,
这里的密码是像“abc”这样的原始密码,我拥有的是散列密码(这是这个“abc”密码存储在数据库中的方式)。
我现在陷入困境,有没有办法在 django 中使用散列密码进行身份验证和登录?
最佳答案
您可以create a custom authentication backend for django并重写其 authenticate
和 get_user
方法,以使用散列密码和用户名进行身份验证。
由于哈希密码只是另一个包含文本的模型字段,因此您可以在数据库中查找具有用户名和哈希密码值的用户。
这样的事情应该有效:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class HashedPasswordAuthBackend(ModelBackend):
def authenticate(self, username=None, password=None):
try:
return User.objects.get(username=username, password=password)
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
之后,将此身份验证后端的路径包含在您的项目设置中。
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'yourapp.backends.HashedPasswordAuthBackend',
]
关于python - django中的身份验证功能使用散列密码而不是原始密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099303/