2

我正在研究openxx(在django上运行),用户将从其他站点重定向到这里,并且我从那里得到哈希密码。Authenticate(username,password) 除了像“dragon”这样的原始密码而不是散列密码,

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

当我在login(request,user)没有验证方法的情况下使用时。出现此错误:

request.session[BACKEND_SESSION_KEY] = user.backend
AttributeError: 'User' object has no attribute 'backend'

所以我需要使用 authenticate 函数在我的用户对象中获取 .backend 属性。

user = authenticate(username=username, password=password)是验证函数的格式,这里的密码是原始密码,如“abc”,我拥有的是哈希密码(这是“abc”密码存储在db中的方式)。

我现在卡住了,有没有办法在 django 中使用散列密码进行身份验证和登录?

4

2 回答 2

3

您可以为 django 创建自定义身份验证后端并覆盖其authenticateget_user方法以使用散列密码和用户名进行身份验证。

由于散列密码只是另一个带有文本的模型字段,因此您可以在 db.xml 中查找具有用户名和散列传递值的用户。

像这样的东西应该工作:

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',
]
于 2016-06-29T12:53:47.150 回答
1

Open edX 使用ratelimitbackend.backends.RateLimitModelBackend进行身份验证,正如我们在设置中看到的那样。此后端需要未散列的密码进行身份验证。

如果您希望根据用户的哈希密码对其进行身份验证,则需要创建一个新的身份验证后端,如django 文档中所述。

我建议你从django.contrib.auth.backends中实现的 Django ModelBackend 中汲取一些灵感。

您看到的与缺失backend属性相关的错误是我以前经历过的。在impersonate_userFUN(一个 Open edX 项目)的视图中,我们是这样解决这个问题的(注意视图函数源代码中的注释):

user = get_object_or_404(User, username=username, is_superuser=False, is_active=True)
user.backend = None
login(request, user)
于 2016-06-29T13:04:26.247 回答