python – 将密码字段迁移到Django

前端之家收集整理的这篇文章主要介绍了python – 将密码字段迁移到Django前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我之前使用过Django(版本1.2)并且通常我喜欢它…它特别擅长快速启动并运行全新的项目.但是,在这种情况下,我正在重写和现有系统并将其移动到 Python / Django.所以,我已经拥有一个MysqL数据库,里面有一个“users”表…这个表存储了用户密码和MysqL SHA1函数(没有盐等).

作为迁移的一部分,我将修复一些数据建模缺陷并将其移植到Postgresql.

我真的很想使用django.contrib.auth,但我不清楚我需要做什么.我已经阅读了文档,并且知道我可以将所需的用户信息和我所拥有的“额外”信息分开并将其放入UserProfile中.

但是,如何处理存储在MysqL数据库中的密码?

以前有人处理过吗?你采取了什么方法

解决方法

这就是我做的事情.我创建了一个自定义身份验证后端.注意:我使用电子邮件地址作为用户名.

这是我的代码

  1. from django.db.models import get_model
  2. from django.contrib.auth.models import User
  3. from hashlib import sha1
  4.  
  5. class MyUserAuthBackend(object):
  6.  
  7. def check_legacy_password(self,db_password,supplied_password):
  8. return constant_time_compare(sha1(supplied_password).hexdigest(),db_password)
  9.  
  10.  
  11. def authenticate(self,username=None,password=None):
  12. """ Authenticate a user based on email address as the user name. """
  13. try:
  14. user = User.objects.get(email=username)
  15.  
  16. if '$' not in user.password:
  17. if self.check_legacy_password(user.password,password):
  18. user.set_password(password)
  19. user.save()
  20. return user
  21. else:
  22. return None
  23.  
  24. else:
  25. if user.check_password(password):
  26. return user
  27.  
  28. except User.DoesNotExist:
  29. return None
  30.  
  31.  
  32. def get_user(self,user_id):
  33. """ Get a User object from the user_id. """
  34. try:
  35. return User.objects.get(pk=user_id)
  36. except User.DoesNotExist:
  37. return None

然后我将以下内容添加到了settings.py:

  1. AUTHENTICATION_BACKENDS = (
  2. 'my_website.my_app.my_file.MyUserAuthBackend',)

来自@Dougal的建议似乎是Django的下一个版本,并且不适用于我(我使用的是1.3.1).但是,它似乎是一个更好的解决方案.

猜你在找的Python相关文章