使用哈希密码而不是原始密码验证django中的功能

时间:2016-06-29 12:18:11

标签: python django authentication hash openedx

我正在使用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中使用哈希密码进行身份验证和登录?

2 个答案:

答案 0 :(得分:2)

您可以create a custom authentication backend for django覆盖其authenticateget_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)
相关问题