Як забезпечити шифрування паролів у Django Admin для власних моделей користувачів

текст перекладу

pic

Коли ви працюєте з власними моделями користувачів у Django, дуже важливо забезпечити правильне шифрування паролів, особливо коли ви створюєте або редагуєте користувачів через інтерфейс адміністратора Django.

Проблема, коли паролі не шифруються в панелі адміністратора Django, зазвичай виникає, коли ви безпосередньо перевизначаєте метод save у вашій власній моделі користувача або коли ви вручну створюєте об'єкти користувачів без належного хешування паролів.

Цей посібник проведе вас через кроки правильного оброблення шифрування паролів у Django після налаштування вашої моделі користувача.

КРОК 1. Визначте свою власну модель користувача

У вашому файлі models.py визначте власну модель користувача. Ось приклад:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager  
from django.db import models  


class CustomUserManager(BaseUserManager):  
 def create_user(self, email, password=None, **extra_fields):  
 if not email:  
 raise ValueError("Поле Email має бути заповнене")  
 email = self.normalize_email(email)  
 user = self.model(email=email, **extra_fields)  
 user.set_password(password) # Забезпечує хешування паролю  
 user.save(using=self._db)  
 return user  

 def create_superuser(self, email, password=None, **extra_fields):  
 extra_fields.setdefault('is_staff', True)  
 extra_fields.setdefault('is_superuser', True)  

 if extra_fields.get('is_staff') is not True:  
 raise ValueError('Суперадміністратор повинен мати is_staff=True.')  
 if extra_fields.get('is_superuser') is not True:  
 raise ValueError('Суперадміністратор повинен мати is_superuser=True.')  

 return self.create_user(email, password, **extra_fields)  

class CustomUser(AbstractBaseUser):  
 username = None  
 email = models.EmailField(unique=True)  
 first_name = models.CharField(max_length=50)  
 last_name = models.CharField(max_length=50)  
 phone_number = models.CharField(max_length=17)  
 is_active = models.BooleanField(default=False)  
 date_of_birth = models.DateField()  
 gender = models.CharField(max_length=10, choices=[('Male', 'Male'), ('Female', 'Female')])  
 location = models.CharField(max_length=20)  
 date_joined = models.DateTimeField(auto_now_add=True)  
 date_updated = models.DateTimeField(auto_now=True)  

 USERNAME_FIELD = 'email'  
 REQUIRED_FIELDS = ['first_name', 'last_name', 'date_of_birth']  

 objects = CustomUserManager()  

 def __str__(self):  
 return self.email

КРОК 2: Оновіть клас Admin для обробки шифрування паролів

Вбудований UserAdmin Django автоматично шифрує паролі під час створення або редагування користувачів.
текст перекладу

Однак для власних моделей користувачів вам потрібно налаштувати інтерфейс адміністратора, щоб зберегти цю функціональність.

У вашому файлі admin.py

from django.contrib.auth.admin import UserAdmin  
from django.utils.translation import gettext_lazy as _  
from .models import CustomUser  

class CustomUserAdmin(UserAdmin):  
 model = CustomUser  

 # Поля для відображення в списку адміністратора  
 list_display = ('email', 'first_name', 'last_name', 'is_active', 'role')  
 list_filter = ('is_active', 'gender')  

 # Поля для сортування та пошуку  
 ordering = ('email',)  
 search_fields = ('email', 'first_name', 'last_name')  

 # Поля для відображення інформації про користувача в адміністратора  
 fieldsets = (  
 (None, {'fields': ('email', 'password')}),  
 (_('Особиста інформація'), {'fields': ('first_name', 'last_name', 'phone_number', 'date_of_birth', 'gender', 'location')}),  
 (_('Права доступу'), {'fields': ('is_active', 'role', 'groups', 'user_permissions')}),  
 (_('Важливі дати'), {'fields': ('last_login',)}),  
 )  

 # Поля для додавання нового користувача  
 add_fieldsets = (  
 (None, {  
 'classes': ('wide',),  
 'fields': ('email', 'first_name', 'last_name', 'phone_number', 'date_of_birth', 'gender', 'location', 'password1', 'password2'),  
 }),  
 )  

 # Використовуйте метод хешування паролів Django  
 def save_model(self, request, obj, form, change):  
 if form.cleaned_data.get('password1') and not change:  
 obj.set_password(form.cleaned_data['password1']) # Хешуємо пароль  
 super().save_model(request, obj, form, change)  

admin.site.register(CustomUser, CustomUserAdmin)

Крок 3: Застосуйте міграції

Після того як ви визначите свою власну модель користувача та налаштування адміністратора, застосуйте міграції (якщо модель користувача була створена та мігрувала до того, як виникла проблема з паролями, що не хешуються, пропустіть цей крок):

python manage.py makemigrations  
python manage.py migrate

Перевірка шифрування паролів в адмінці

  1. Увійдіть в панель адміністратора Django.
  2. Додайте або відредагуйте користувача.
  3. Перевірте базу даних, щоб переконатися, що пароль зберігається як зашифроване значення (наприклад, з використанням pbkdf2_sha256 або вашого налаштованого хешувальника паролів).

Висновок

Дотримуючись цих кроків, ви забезпечите правильне шифрування паролів в адмінці Django при використанні власної моделі користувача. Це налаштування забезпечує безпеку та відповідає найкращим практикам Django для обробки чутливої інформації, такої як паролі.

Перекладено з: How to Ensure Password Encryption in Django Admin for Custom User Models

Leave a Reply

Your email address will not be published. Required fields are marked *