使用散列密码而不是原始密码在 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 并覆盖其 authenticate
和 get_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)
我正在使用 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 并覆盖其 authenticate
和 get_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)