Django 菜鸟。将表从 MySQL 导出和导入到 PostgreSQL。客户和客户的表称为 users
。
尝试使用 python manage.py shell
将测试帐户的密码更新为 Django 用于加密的密码。尝试了以下显然行不通的方法,因为未导入哈希算法:
from account.models import Users
user = Users.objects.filter(pk=2)
user.set_password('new_password')
错误是因为没有属性“set_password”
。
很好。尝试所有教程所说的内容:
from django.contrib.auth.models import User
User.objects.filter(pk=2)
Queryset []
User.objects.all()
然后它返回auth_user
表中唯一的用户。
那么基本上,我如何使用 Django 的加密来对付遗留 users
表?
在 Django 中,客户和客户帐户似乎在 auth_user
表中?我认为该表更适合应该有权访问 /admin
的用户,而使用该应用程序的客户/客户则在不同的表中。
编辑 1:
遗留表的密码存储在管理员定义的盐中(我相信 Django 对每个用户或类似的东西使用独特的算法,所以这就是为什么我提到盐对每个人都是一样的)+ 发送的用户密码通过哈希算法(我认为是 SHA256)。所以不是纯文本。
我清除了每个人的密码,准备重新设置。由于旧表使用一个散列而 Django 使用完全不同的散列,所以我不想在 Django 散列下进行解密和重新加密。从头开始。
此外,我想继续为客户/客户使用 users
表,并为 /admin
的用户保留 auth_user
.. .除非我的想法是错误的。
最佳答案
好吧,您还没有提到您的旧表是什么样的,这个答案假定它具有基本的用户名、密码和电子邮件字段。如果您目前以明文形式存储密码,则可以对其进行哈希处理,但如果您使用某种第三方解决方案,则每个用户都必须重置他/她的密码。
import account.models import User as LegacyUser
import django.contrib.auth.models User
users = []
for u in LegacyUser.objects.all():
new_user = User(username=u.user, email=u.email)
new_user.set_password(u.password)
users.append(new_user)
User.objects.bulk_create(users)
以上是如果你想挽救密码,如果你不这样做:
INSERT INTO auth_user(username,password,email) SELECT username, password, email FROM account_user
在 psql 或 pgadmin 或其他什么。这应该快得多。
Also, I would like to keep using the users table for clients/customers and keep the auth_user for users of /admin... unless my thinking is wrong on this.
很抱歉,您的想法是错误的。不需要两个表,因为 django.contrib.auth.User 表有两个字段 is_staff
和 is_superuser
专门用来处理这种情况。
或者,您可以完全放弃 django.contrib.auth.models.User 模型并使用您的用户模型作为默认模型。参见 Specifying a custom user model拥有两个模型只是重复代码和工作,并可能引入安全问题
关于Django:加密密码到遗留(不是auth_user)表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498730/