python - django中的身份验证功能使用散列密码而不是原始密码

标签 python django authentication hash openedx

我正在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并重写其 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',
]

关于python - django中的身份验证功能使用散列密码而不是原始密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099303/

相关文章:

python - 无法使用 Google 云存储将文件保存到存储桶。可以在服务器上运行,但不能在本地运行

python - Django 教程应用程序,第 2 部分。为什么缺少 - 在 makemigrations 命令后添加字段问题到选择?

Django:只收集更改的静态文件

python - Django 多对多关系(类别)

android - 登录过程应该如何?

c# - 在 Android (Xamarin) 上实现 Office 365 API 的问题

php - CodeIgniter 2.1.0 session 问题

python - OpenCV 中的 PIL ImageChops.screen

python - 为什么我不能在 qt 设计器中向 textBrowser 添加列表?

python - s3.Object() 抛出 TypeError : sequence item 0: expected str instance, tuple found