之前我曾使用过Django(版本1.2),而且我喜欢它...它特别擅长快速启动并运行全新的项目。但是,在这种情况下,我正在重写和现有系统并将其移动到Python / Django。所以,我已经拥有一个MySQL数据库,里面有一个“users”表...这个表存储了用户密码和MySQL SHA1函数(没有盐等)。
作为迁移的一部分,我将修复一些数据建模缺陷并将其移植到PostgreSQL。
我真的很想使用django.contrib.auth,但我不清楚我需要做什么。我已经阅读了文档,并且知道我可以将所需的用户信息和我所拥有的“额外”信息分开并将其放入UserProfile中。
但是,如何处理存储在MySQL数据库中的密码?
以前有人处理过吗?你采取了什么方法?
答案 0 :(得分:8)
以下是我为使事情发挥作用而采取的措施。我创建了一个自定义身份验证后端。注意:我使用电子邮件地址作为用户名。
这是我的代码:
from django.db.models import get_model
from django.contrib.auth.models import User
from hashlib import sha1
class MyUserAuthBackend(object):
def check_legacy_password(self, db_password, supplied_password):
return constant_time_compare(sha1(supplied_password).hexdigest(), db_password)
def authenticate(self, username=None, password=None):
""" Authenticate a user based on email address as the user name. """
try:
user = User.objects.get(email=username)
if '$' not in user.password:
if self.check_legacy_password(user.password, password):
user.set_password(password)
user.save()
return user
else:
return None
else:
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
""" Get a User object from the user_id. """
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
然后我将以下内容添加到了settings.py:
AUTHENTICATION_BACKENDS = (
'my_website.my_app.my_file.MyUserAuthBackend',
)
来自@Dougal的建议似乎是针对Django的下一个版本,并且不适用于我(我使用的是1.3.1)。但是,它似乎是一个更好的解决方案。
答案 1 :(得分:1)
您可以将其直接放入user_password
字段 - 请参阅the Django docs。由于您没有盐,请尝试使用格式sha1$$password_hash
。我还没有调查过它是否会使用空白的盐,但这可能是你能够在没有黑客攻击的情况下进行迁移的唯一方法django.contrib.auth
或编写自己的身份验证后端。
否则,你可以为用户设置一个不可用的密码(规范的事情是将字段设置为!
)并将它们指向忘记密码系统。
答案 2 :(得分:1)
Django的最新版本提供了一个未加保留的旧密码的版本。只需将其添加到您的设置文件中:
PASSWORD_HASHERS = (
...
'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher',
)