我正在使用opensx(在django上运行),用户将从其他站点重定向到此处,我将从那里获得哈希密码。 验证(用户名,密码)除了“龙”之外的原始密码,而不是哈希值,
所以我需要使用带有哈希密码的authenticate(),以便我可以获得“.backend”属性并继续我的生活。
当我使用request.session[BACKEND_SESSION_KEY] = user.backend
AttributeError: 'User' object has no attribute 'backend'
而没有验证方法时。出现此错误:
user = authenticate(username=username, password=password)
所以我需要使用authenticate函数在我的用户对象中获取.backend属性。
{{1}}是身份验证功能的格式, 这里的密码是一个原始密码,如“abc”,我所拥有的是一个哈希密码(这就是这个“abc”密码将存储在db中的方式)。
我现在卡住了,有没有办法在django中使用哈希密码进行身份验证和登录?
答案 0 :(得分:2)
您可以create a custom authentication backend for django覆盖其authenticate
和get_user
方法,以使用散列密码和用户名进行身份验证。
由于散列密码只是另一个包含文本的模板文件,因此您可以使用用户名和db中的散列传递值查找用户。
这样的事情应该有效:
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',
]
答案 1 :(得分:0)
Open edX使用ratelimitbackend.backends.RateLimitModelBackend
进行身份验证,我们可以在settings中看到。此后端需要使用未经过哈希处理的密码进行身份验证。
如果您希望根据其哈希密码对用户进行身份验证,则需要创建新的身份验证后端,如django documentation中所述。
我建议你从Django ModelBackend中汲取灵感,并在django.contrib.auth.backends中实现。
您看到的与丢失的backend
属性相关的错误是我之前遇到过的。在FUN(一个Open edX项目)的impersonate_user
视图中,这就是我们解决这个问题的方法(注意视图函数源代码中的注释):
user = get_object_or_404(User, username=username, is_superuser=False, is_active=True)
user.backend = None
login(request, user)