почему пароль пользователя django не зашифрован при создании нового пользователя? - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать свою собственную пользовательскую модель с AbstractUser классом

class CustomUser(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)

    def __str__(self):
        return self.username

class Student(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username

, но когда я создаю новую учетную запись, поле пароля не будет зашифровано, в нем будет показан только простой текст! я думаю, что я должен использовать BaseUserManager, но у меня нет никакой идеи, чтобы сделать это спасибо, с уважением ..

Screenshot

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Я полагаю, что вы должны зашифровать пароль самостоятельно.

Простой способ сделать это - использовать библиотеку, подобную криптографии, которую вы можете установить с помощью pip install cryptography


from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
tasty_salt = b'some tasty salt to help us digest that password'
def hashPassword(password):
  digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
  digest.update(str.encode(password))
  digest.update(tasty_salt)
  return digest.finalize()


def verifyPassword(input_password,hashed_password):#get hashed_password from your user model
  digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
  digest.update(str.encode(input_password))
  digest.update(tasty_salt)
  return digest.finalize() == hashed_password

print(verifyPassword('password',hashPassword('password')))

это позволит вам иметь пароль sh в вашей пользовательской модели. Просто импортируйте его в свой проект, и вы должны быть хороши до go.

1 голос
/ 04 марта 2020

Поскольку я точно не знаю, как вы создаете нового пользователя, я предполагаю, что вы делаете что-то вроде

user = CustomUser.objects.create(username="boohoo", email="boo@hoo.com", password="boohoopass")

Этот объект пользователя будет хранить пароль в виде простого текста. Django автоматически не преобразует текст в хэшированное значение, вместо этого, если вы копаете глубже, вы найдете метод с именем make_password или в AbstractUser, set_password есть метод, который в основном преобразует строку в ha sh ценность. Поэтому, когда вы создаете пользователя, используйте любой из этих методов.

user = CustomUser.objects.create(username="boohoo", email="boo@hoo.com")

user.passowrd = make_password("boohoopass")

# or 

user.set_password("boohoopass")

Еще лучший подход - использовать метод в UserManager, create_user, который автоматически сделает это за вас.

user = CustomUser.objects.create_user(username="boohoo", email="boo@hoo.com", password="boohoopass")

ОБНОВЛЕНО В вашем случае ваш класс администратора также должен наследовать от UserAdmin от django. Потому что администратор пользователя также вызывает специфицированные c функции для создания таких вещей, как пароль ha sh keys.

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as OrigUserAdmin


@admin.register(CustomUser)
class CustomUserAdmin(OrigUserAdmin):
    list_display = (
        'id', 'first_name', 'last_name', 'username', 'email', 'is_active'
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...