1

我有两种类型的 Django 服务器。一种是包含主数据库的中央服务器。只有其中一个。

然后有任意数量的客户端服务器包含自己的数据库。这些客户端数据库充当主数据库的缓存。

这用于用户。我有一个用户尝试登录客户端服务器 1,该服务器在其数据库中查找该用户。如果它不存在,它会发送到中央服务器并询问该服务器用户是否存在于主数据库中。如果是这样,中央服务器会返回用户信息,以便客户端服务器可以将其存储/缓存在自己的数据库中,然后将用户登录。用户每次连续尝试登录时,都会在客户端数据库中找到该用户并且它不再需要发送到中央服务器。

中央服务器以 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>)如果我将密码设置为加密文本(

4

1 回答 1

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

于 2018-02-10T12:50:30.067 回答