我有两种类型的Django服务器。一个是包含主数据库的中央服务器。只有其中一个。
然后有任意数量的客户端服务器包含自己的数据库。这些客户端数据库充当主数据库的缓存。
这用于用户。我是用户尝试登录客户端服务器1,该服务器在其数据库中查找用户。如果它不在那里,它将转到中央服务器并询问该服务器是否存在于master数据库中的用户。如果是这样,中央服务器返回用户信息,以便客户端服务器可以将其存储/缓存在自己的数据库中,然后将用户登录。用户尝试登录的每个连续时间,用户都可以在客户端数据库中找到它不再需要去中央服务器。
中央服务器将用户信息作为JSON返回,如下所示:
{
"username": "joe.bag.o.doughnuts",
"id": 143,
"password": "fksdfjfldskjf",
}
我的问题是密码。当我将值放在user.password
时,它使用该密码的加密版本。这很好,因为出于安全原因,我不希望在http连接中出现纯文本密码。但是,如何在客户端服务器上创建用户副本时正确存储加密密码?如果我将密码设置为加密文本(User.objects.create(username=<retrieved_username>, password=<retrieved_password_which_is_already_encrypted>)
),它会将其视为纯文本密码,然后对其进行加密...即使它已加密,因此它会加密加密,而不是实际密码。 / p>
答案 0 :(得分:0)
我想知道你能否以User.objects.create(...)
的方式实现这一目标?取决于服务器限制等,但这对你有用吗?
从bash,也许作为cron工作,这样的事情:
python manage.py dumpdata auth.users --indent 2 --natural-foreign --output users.json
然后使用以下内容加载到其他服务器上:
python manage.py loaddata users.json
或者替代方案,您可以创建自定义用户管理器,以便使用以前散列的密码导入用户:
from django.contrib.auth.base_user import BaseUserManager
class UserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, password=password, **extra_fields)
# Normally here Django uses the set_password function
# https://docs.djangoproject.com/en/2.0/ref/contrib/auth/#django.contrib.auth.models.User.set_password
user.save(using=self._db)
return user
有关在此处扩展/覆盖User
课程的更多信息:https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html