在Django服务器之间传输用户

时间:2018-02-10 03:06:03

标签: django encryption server-to-server

我有两种类型的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>

1 个答案:

答案 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