Шифрование паролей в модели Django

Надеюсь, у вас все хорошо, я сейчас работаю над проектом Django, и это мой первый проект, поэтому я нашел много проблем, которые я исправляю одну за другой, но я действительно застрял на этой. Речь идет о шифровании Django пароля в записях базы данных, он просто не шифрует пароль для всех пользователей, кроме администратора. Надеюсь, что вы сможете мне помочь и спасибо за ваше время :D

models.py

from django.db import models
from django.db.models import Model
from passlib.hash import pbkdf2_sha256 
from django.utils.translation import gettext_lazy as _
from .manager import *
# Create your models here.


class User(Model):
    id = models.AutoField(primary_key=True, unique=True)
    email = models.EmailField( _("email"),max_length = 254 ,null=False)
    password = models.CharField(max_length= 255, null=False)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    objects=CustomUserManager()
    
    USERNAME_FIELD="email"
    REQUIRED_FIELDS= ["password"]

    class Meta:
        abstract = True
        verbose_name = _("user")
        verbose_name_plural = _("users")
    
    def __str__(self):
        return self.first_name + " " + self.last_name

    def getID(self):
        return self.id

    def getEmail(self):
        return self.email
    
    def getPass(self):
        return self.password

    def getFirstName(self):
        return self.first_name

    def getLastName(self):
        return self.last_name

    def checkIfSuperUser(self):
        return self.is_superuser

    def checkIfStaff(self):
        return self.is_staff

    def checkIfActif(self):
        return self.is_active

    def verify_password(self, raw_password):
        return pbkdf2_sha256.verify(raw_password, self.password)

class Prof(User):
    courses = models.CharField(max_length=100)
    
    class Meta:
        verbose_name_plural = 'Profs' 

Manager.py

from .models import *
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import gettext_lazy as _
from passlib.hash import pbkdf2_sha256

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError(_('The Email must be set'))
        email = self.normalize_email(email)
        password = pbkdf2_sha256.encrypt(password)
        user = self.model(email=email, password=password, **extra_fields)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(email, password, **extra_fields)

Я предлагаю использовать собственную модель пользователя Django

https://docs.djangoproject.com/en/4.0/ref/contrib/auth/

Если вам нужно что-то, что не входит в комплект, вы можете сделать это на заказ

https://docs.djangoproject.com/en/4.0/topics/auth/customizing/

Почему бы не использовать класс AbstractBaseUser вместо models.Model для создания модели пользователя. Затем использовать метод set password в менеджере пользователей

Вернуться на верх