[英]Using Django authentication system with existing hashed passwords
我有一个带有用户表的非常老的Perl CGI系统。 使用crypt
函数将密码存储为计算得出的哈希值。 我希望将系统迁移到Django,并且我想在使用Django表结构时保留用户数据。
一种选择是将所有用户/密码数据复制到auth_user
表中,并使用自定义身份验证功能,因为我已有密码哈希。
我有更好的选择吗?
如果我选择此选项,那么如何实现呢?
编写自定义身份验证后端的文档在Django中的自定义身份验证中
由于Borodin提出了要求,并且由于您可能会发现有一个更具体针对您的请求的示例很方便,因此我继续写了一个示例,该示例针对基于crypt
的文件(例如htpasswd
)进行身份验证。
如果后端在crypt
文件中找到密码匹配的用户,则它将寻找标准的Django用户并返回。 如果找不到,它将创建一个。 显然,您需要决定如何处理实现的实际细节。
import crypt
from django.conf import settings
from django.contrib.auth.models import User
class CryptBackend(object):
def authenticate(self, request, username=None, password=None):
crypt_file = getattr(settings, "CRYPT_DB", None)
if crypt_file is None:
return None
password_match = False
with open(crypt_file,"r") as f:
for line in f:
(user, crypted_pass) = line.rstrip().split(":")
if user == username:
password_match = crypt.crypt(password, crypted_pass) == crypted_pass
break
if not password_match:
return None
# found a match in our crypt database
try:
django_user = User.objects.get(username=username)
except User.DoesNotExist:
django_user = User.objects.create_user(username=username, email='', password=password)
django_user.is_staff = True
django_user.save()
return django_user
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
该新的自定义后端将根据settings.py
添加内容进行加载。 在我的示例中,我保留了默认的Django后端,并仅添加了新的自定义后端。 Django会按顺序检查它们,因此它将尝试标准的Django身份验证,如果不起作用,请转到我的自定义身份验证。 CRYPT_DB
参数是htpasswd
文件的路径。
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'authbackend.CryptBackend',
]
CRYPT_DB = '/path/to/your/passwd.file'
为了完整htpasswd
,上面要检查的格式( htpasswd
)的示例。
jill:C.1oP2DOot4MY
jack:qJn7lPS/VNssM
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.