使用散列密码而不是原始密码在 django 中验证函数

authenticate function in django using hashed password not the raw one

我正在使用 openedx(在 django 上运行),用户将从其他站点重定向到这里,我从那里获得散列密码。 Authenticate(username,password) 原始密码除外 "dragon" 而不是散列密码

所以我需要使用带有散列密码的 authenticate() 以便我可以获得“.backend”属性并继续我的生活。

当我使用 login(request,user) 而不使用身份验证方法时。出现此错误:

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 并覆盖其 authenticateget_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',
]

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)