PÔhjalik juhend kohandatud kasutajamudelite juurutamiseks Djangos, parandades autentimist globaalseteks rakenduste vajadusteks. Parimad tavad ja arenenud tehnikad.
Python Django Autentimine: Kohandatud Kasutajamudelite Valdamine Globaalseteks Rakendusteks
Django sisseehitatud autentimissĂŒsteem on paljude veebirakenduste jaoks vĂ”imas alguspunkt. Kuid kui teie rakendus skaleerub ja muutub keerukamaks, eriti globaalsele publikule suunates, ei pruugi vaikimisi kasutajamudel olla piisav. Siin tulevad mĂ€ngu kohandatud kasutajamudelid, pakkudes suuremat paindlikkust ja kontrolli kasutajaandmete ja autentimisprotsesside ĂŒle. See pĂ”hjalik juhend tutvustab teile Djangos kohandatud kasutajamudelite loomist ja juurutamist, tagades, et teie rakendus on hĂ€sti varustatud mitmekesiste kasutajanĂ”uete ja turvalisuskaalutlustega toimetulekuks.
Miks kasutada kohandatud kasutajamudelit?
Django vaikimisi kasutajamudel on loodud tavaliste atribuutidega nagu kasutajanimi, parool, e-post, eesnimi ja perekonnanimi. Kuigi see sobib lihtsate rakenduste jaoks, jÀÀb sellest sageli puudu, kui teil on vaja:
- Salvestada tÀiendavat kasutajateavet: Kujutage ette globaalset e-kaubanduse platvormi, mis peab salvestama kasutaja eelistusi, aadresse erinevates vormingutes, eelistatud valuutasid vÔi keele seadeid. Need on vaikimisi mudeli ulatusest vÀljas.
- Muuta autentimisvÀlja: VÔib-olla soovite autentida kasutajaid nende e-posti aadressi, mitte kasutajanime kaudu, vÔi juurutada mitmefaktorilise autentimise, mis nÔuab lisavÀlju.
- Integreerida olemasolevate andmebaasidega: Kui integreerite Django rakenduse olemasoleva andmebaasiga, millel on erinev kasutajaskeem, vÔimaldab kohandatud kasutajamudel teil oma mudelit olemasoleva andmestruktuuriga vastendada.
- Suurendada turvalisust: Kohandatud mudelid vĂ”imaldavad suuremat kontrolli parooli krĂŒpteerimise, parooli lĂ€htestamise mehhanismide ja muude turvalisusega seotud aspektide ĂŒle.
- Juurutada erinevaid kasutajarolle: RollipĂ”hise juurdepÀÀsukontrolli (RBAC) andmete otsene salvestamine mudelisse (vĂ”i sellele viitamine) pakub paindlikumat ja selgemat kontrolli kui ĂŒldised grupid ja Ă”igused.
Kohandatud kasutajamudeli kasutamine pakub puhast ja hooldatavat viisi kasutajaprofiili laiendamiseks, muutmata otse Django pĂ”hiautentimissĂŒsteemi. See on parim tava igas projektis, mis prognoosib tulevast kasvu vĂ”i nĂ”uab spetsialiseeritud kasutajaandmeid.
Millal juurutada kohandatud kasutajamudel?
Parim aeg kohandatud kasutajamudeli juurutamiseks on teie projekti alguses. Kasutajamudeli muutmine tootmiskeskkonnas vÔib olla keeruline ja potentsiaalselt andmeid kahjustav. Kui teie projekt on juba kÀimas, kaaluge hoolikalt tagajÀrgi ja looge enne muudatuste tegemist tugev migratsiooniplaan.
Siin on ĂŒldine juhis:
- Alustage kohandatud kasutajamudeliga: Kui nÀete ette vajadust laiendatud kasutajateabe vÔi kohandatud autentimisloogika jÀrele.
- Kaaluge migratsiooni hoolikalt: Kui teil on juba töötav Django projekt kasutajatega ja otsustate ĂŒle minna kohandatud mudelile. Varundage oma andmebaas ja mĂ”istke migratsiooniprotsessi pĂ”hjalikult.
Kohandatud Kasutajamudeli Loomine
Djangos kohandatud kasutajamudeli loomiseks on kaks peamist lÀhenemist:
- AbstractBaseUser: See lĂ€henemine annab teile tĂ€ieliku kontrolli kasutajamudeli ĂŒle. Te mÀÀratlete kĂ”ik vĂ€ljad, sealhulgas kasutajanime, parooli, e-posti ja kĂ”ik vajalikud kohandatud vĂ€ljad.
- AbstractUser: See lĂ€henemine pĂ€rib vaikimisi Django kasutajamudelilt ja vĂ”imaldab teil lisada vĂ”i ĂŒle kirjutada olemasolevaid vĂ€lju. See on lihtsam, kui teil on vaja lisada vaid mĂ”ned lisavĂ€ljad.
1. AbstractBaseUseri kasutamine (tÀielik kontroll)
See on kĂ”ige paindlikum valik, mis vĂ”imaldab teil kogu kasutajamudeli nullist mÀÀratleda. See pakub suurimat kontrolli kasutajaandmete struktuuri ja autentimisprotsessi ĂŒle. Siin on, kuidas:
Samm 1: Looge kohandatud kasutajamudel
Oma Django rakenduses (nt 'accounts') looge fail `models.py` ja mÀÀratlege oma kohandatud kasutajamudel, mis pÀrib `AbstractBaseUser` ja `PermissionsMixin` klassidelt:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
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, **extra_fields):
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)
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True, verbose_name='email address')
first_name = models.CharField(max_length=150, blank=True)
last_name = models.CharField(max_length=150, blank=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(auto_now_add=True)
# Custom fields (Example: preferred language, timezone, etc.)
preferred_language = models.CharField(max_length=10, default='en', choices=[('en', 'English'), ('fr', 'French'), ('es', 'Spanish')])
timezone = models.CharField(max_length=50, default='UTC')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [] # Required when creating a superuser
objects = CustomUserManager()
def __str__(self):
return self.email
Selgitus:
- CustomUserManager: See klass on vajalik teie kohandatud kasutajamudeli haldamiseks. See tegeleb kasutajate ja superkasutajate loomisega. `normalize_email` on oluline e-posti konsistentsuse tagamiseks erinevate lokaatide ja sisestusmeetodite vahel.
- CustomUser: See on teie kohandatud kasutajamudel.
- `email = models.EmailField(unique=True, verbose_name='email address')`: MÀÀratleb e-posti vĂ€lja kui kasutaja unikaalse identifikaatori. `unique=True` tagab, et igal kasutajal on unikaalne e-posti aadress. Ăksikasjalik nimi parandab administraatoriliidest.
- `first_name`, `last_name`: Standardsed vĂ€ljad kasutaja nime salvestamiseks. `blank=True` vĂ”imaldab neid vĂ€lju tĂŒhjana jĂ€tta.
- `is_staff`, `is_active`: Standardsed vÀljad kasutaja juurdepÀÀsu kontrollimiseks administraatoripaneelile ja konto aktiveerimiseks.
- `date_joined`: Salvestab kuupÀeva, mil kasutajakonto loodi.
- `preferred_language`, `timezone`: NĂ€idiskohandatud vĂ€ljad kasutaja eelistuste salvestamiseks. `choices` argument piirab vĂ”imalikke keelevĂ”imalusi. See on globaalse rakenduse jaoks ĂŒlioluline. Ajavöönd on samuti oluline lokaliseerimiseks.
- `USERNAME_FIELD = 'email'`: MÀÀrab, et e-posti vÀlja kasutatakse autentimiseks kasutajanimeks.
- `REQUIRED_FIELDS = []`: MÀÀratleb vÀljad, mis on nÔutavad superkasutaja loomisel `createsuperuser` kÀsu abil. Sel juhul pole lisavÀlju peale e-posti ja parooli vaja.
- `objects = CustomUserManager()`: MÀÀrab kohandatud kasutajahalduri mudelile.
- `__str__(self)`: MÀÀratleb, kuidas kasutajaobjekt on esitatud stringina (nt administraatoripaneelis).
Samm 2: Uuendage `settings.py`
Andke Djangole teada oma kohandatud kasutajamudeli kasutamisest, lisades jÀrgmise rea faili `settings.py`:
AUTH_USER_MODEL = 'accounts.CustomUser'
Asendage `accounts` oma rakenduse nimega, kus mÀÀratlesite `CustomUser` mudeli.
Samm 3: Looge ja rakendage migratsioonid
KÀivitage jÀrgmised kÀsud migratsioonide loomiseks ja rakendamiseks:
python manage.py makemigrations
python manage.py migrate
See loob teie kohandatud kasutajamudeli jaoks uue andmebaasitabeli.
Samm 4: Kohandatud kasutajamudeli kasutamine
NĂŒĂŒd saate oma kohandatud kasutajamudelit kasutada oma vaadetes, mallides ja muudes rakenduse osades. NĂ€iteks uue kasutaja loomiseks:
from accounts.models import CustomUser
user = CustomUser.objects.create_user(email='user@example.com', password='password123', first_name='John', last_name='Doe')
2. AbstractUseri kasutamine (vaikimisi mudelile lisamine)
See lÀhenemine on lihtsam, kui teil on vaja lisada vaikimisi Django kasutajamudelile vaid mÔned lisavÀljad. See pÀrib kÔik olemasolevad vÀljad ja meetodid `AbstractUser` klassilt. See vÔib olla lihtsam lihtsamaks kohandamiseks.
Samm 1: Looge kohandatud kasutajamudel
Oma Django rakenduse failis `models.py` mÀÀratlege oma kohandatud kasutajamudel, mis pÀrib `AbstractUser` klassilt:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
# Add extra fields here
phone_number = models.CharField(max_length=20, blank=True, verbose_name='Phone Number')
profile_picture = models.ImageField(upload_to='profile_pictures/', blank=True)
# Custom fields (Example: preferred currency, address format, etc.)
preferred_currency = models.CharField(max_length=3, default='USD', choices=[('USD', 'US Dollar'), ('EUR', 'Euro'), ('JPY', 'Japanese Yen')])
address_format = models.CharField(max_length=50, blank=True, help_text='e.g., "Name, Street, City, Zip, Country"')
def __str__(self):
return self.username
Selgitus:
- CustomUser: See on teie kohandatud kasutajamudel, mis pÀrib `AbstractUser` klassilt.
- `phone_number`, `profile_picture`: NÀidisvÀljad, mida kasutajamudelile lisada. `upload_to` mÀÀrab, kuhu profiilipildid salvestatakse.
- `preferred_currency`, `address_format`: NÀidiskohandatud vÀljad, mis on olulised globaalsete rakenduste jaoks. Erinevates riikides on aadresse drastiliselt erinevas vormingus.
- `__str__(self)`: MÀÀratleb, kuidas kasutajaobjekt on esitatud stringina (nt administraatoripaneelis). Siin kasutatakse kasutajanime.
Samm 2: Uuendage `settings.py`
Sarnaselt eelnevale, andke Djangole teada oma kohandatud kasutajamudeli kasutamisest, lisades jÀrgmise rea faili `settings.py`:
AUTH_USER_MODEL = 'accounts.CustomUser'
Samm 3: Looge ja rakendage migratsioonid
KÀivitage jÀrgmised kÀsud migratsioonide loomiseks ja rakendamiseks:
python manage.py makemigrations
python manage.py migrate
Samm 4: Kohandatud kasutajamudeli kasutamine
NĂŒĂŒd pÀÀsete juurde lisatud vĂ€ljadele, kui töötate kasutajaobjektidega:
from accounts.models import CustomUser
user = CustomUser.objects.create_user(username='johndoe', password='password123', email='john.doe@example.com')
user.phone_number = '+15551234567'
user.preferred_currency = 'EUR'
user.save()
Parimad tavad kohandatud kasutajamudelite loomiseks globaalsetes rakendustes
Kohandatud kasutajamudelite juurutamisel globaalsele publikule suunatud rakenduste jaoks arvestage jÀrgmiste parimate tavadega:
1. Rahvusvahelistamine ja lokaliseerimine (i18n & l10n)
Salvestage lokaalipÔhiseid andmeid: Kujundage oma mudel nii, et see arvestaks erinevate kultuurinormide ja andmevormingutega. Salvestage kuupÀevad, kellaajad, numbrid ja aadressid lokaaditeadlikul viisil.
NĂ€ide:
from django.utils import timezone
class CustomUser(AbstractUser):
#...
date_of_birth = models.DateField(blank=True, null=True)
def get_localized_date_of_birth(self, language_code):
if self.date_of_birth:
return timezone.localtime(timezone.make_aware(datetime.datetime.combine(self.date_of_birth, datetime.time.min))).strftime('%x') # Format according to the locale
return None
2. Ajavööndi kÀsitlemine
Salvestage ja kÀsitlege ajavööndeid alati Ôigesti. Salvestage ajavööndi teave kasutajamudelisse ja kasutage seda kuupÀevade ja kellaaegade kuvamiseks kasutaja kohalikus ajavööndis.
NĂ€ide:
from django.utils import timezone
class CustomUser(AbstractUser):
#...
timezone = models.CharField(max_length=50, default='UTC')
def get_localized_time(self, datetime_obj):
user_timezone = pytz.timezone(self.timezone)
return timezone.localtime(datetime_obj, user_timezone)
3. Aadressi vormindamine
Aadressivormingud varieeruvad riigiti oluliselt. Juurutage paindlik aadressisĂŒsteem, mis vĂ”imaldab kasutajatel sisestada oma aadressi oma asukoha jaoks Ă”iges vormingus. Kaaluge kolmanda osapoole teegi vĂ”i teenuse kasutamist aadressi valideerimiseks ja vormindamiseks.
NĂ€ide:
class CustomUser(AbstractUser):
#...
country = models.CharField(max_length=50, blank=True)
address_line_1 = models.CharField(max_length=255, blank=True)
address_line_2 = models.CharField(max_length=255, blank=True)
city = models.CharField(max_length=100, blank=True)
postal_code = models.CharField(max_length=20, blank=True)
def get_formatted_address(self):
# Implement logic to format address based on country
if self.country == 'US':
return f'{self.address_line_1}\n{self.address_line_2}\n{self.city}, {self.postal_code}, {self.country}'
elif self.country == 'GB':
return f'{self.address_line_1}\n{self.address_line_2}\n{self.city}\n{self.postal_code}\n{self.country}'
else:
return 'Address format not supported'
4. Valuuta kÀsitlemine
Kui teie rakendus hÔlmab finantstehinguid, salvestage kasutaja eelistatud valuuta ja kasutage seda hindade ja summade kuvamiseks. Kasutage teeki nagu `babel` valuutavÀÀrtuste vormindamiseks vastavalt kasutaja lokaadile.
NĂ€ide:
from babel.numbers import format_currency
class CustomUser(AbstractUser):
#...
preferred_currency = models.CharField(max_length=3, default='USD')
def get_formatted_price(self, amount):
return format_currency(amount, self.preferred_currency, locale='en_US') # Adjust locale as needed
5. Andmete valideerimine
Juurutage tugev andmete valideerimine tagamaks, et kasutaja sisestus on kehtiv ja jÀrjepidev. Kasutage Django sisseehitatud valideerijaid vÔi looge kohandatud valideerijaid andmete terviklikkuse tagamiseks.
NĂ€ide:
from django.core.validators import RegexValidator
class CustomUser(AbstractUser):
#...
phone_number = models.CharField(
max_length=20,
blank=True,
validators=[
RegexValidator(
regex=r'^\+?\d{9,15}$',
message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed."
),
]
)
6. Turvalisuskaalutlused
Parooli krĂŒpteerimine: Django autentimissĂŒsteem kasutab vaikimisi tugevaid parooli krĂŒpteerimise algoritme. Veenduge, et kasutate Django uusimat versiooni, et saada kasu uusimatest turvavĂ€rskendustest.
Kahefaktoriline autentimine (2FA): Juurutage 2FA, et lisada kasutajakontodele tÀiendav turvakiht. Selleks on saadaval erinevad Django paketid, nÀiteks `django-otp`. See on eriti oluline tundlike kasutajaandmete vÔi finantstehingute kÀsitlemisel.
Andmekaitse: JĂ€rgige andmekaitse ja privaatsuse parimaid tavasid, eriti tundliku kasutajateabega tegelemisel. JĂ€rgige asjakohaseid andmekaitseregulatsioone, nagu GDPR ja CCPA. Kaaluge andmete krĂŒpteerimist, anonĂŒĂŒmimist ja tokeniseerimistehnikaid.
7. Testimine
Kirjutage pĂ”hjalikud ĂŒhikutestid ja integratsioonitestid tagamaks, et teie kohandatud kasutajamudel töötab ootuspĂ€raselt ja teie autentimissĂŒsteem on turvaline. Testige erinevaid stsenaariume, sealhulgas kehtivat ja kehtetut kasutaja sisestust, parooli lĂ€htestamise töövooge ja Ă”iguste kontrolle.
8. Dokumentatsioon
Dokumenteerige oma kohandatud kasutajamudel ja autentimissĂŒsteem pĂ”hjalikult. See teeb teistel arendajatel teie koodi mĂ”istmise ja hooldamise lihtsamaks. Lisage teave iga vĂ€lja eesmĂ€rgi, autentimisvoo ja kĂ”igi turvalisuskaalutluste kohta.
Arenenud tehnikad ja kaalutlused
1. Kohandatud kasutajahaldurid
Nagu nÀidatud `AbstractBaseUser` nÀites, on kohandatud kasutajahaldurid kasutajate loomiseks ja haldamiseks hÀdavajalikud. Need vÔimaldavad teil mÀÀratleda kohandatud loogika kasutajate loomiseks, nÀiteks teatud vÀljade vaikevÀÀrtuste seadistamiseks vÔi tÀiendava valideerimise teostamiseks.
2. Proksimudelid
Proksimudelid vÔimaldavad teil lisada kasutajamudelile meetodeid ilma andmebaasi skeemi muutmata. See vÔib olla kasulik kohandatud loogika vÔi arvutuste lisamiseks, mis on spetsiifilised teie rakendusele.
3. Kasutajamudeli laiendamine profiilimudeliga
Selle asemel, et lisada palju vĂ€lju otse kasutajamudelisse, vĂ”ite luua eraldi profiilimudeli, millel on ĂŒks-ĂŒhele seos kasutajamudeliga. See aitab hoida teie kasutajamudeli puhta ja organiseerituna.
from django.db import models
from django.conf import settings
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
# Additional fields
bio = models.TextField(blank=True)
location = models.CharField(max_length=100, blank=True)
Pidage meeles, et looge signaal, mis loob automaatselt UserProfile'i, kui kasutaja luuakse:
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
from .models import UserProfile
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
4. Ăhekordne sisselogimine (SSO)
Suuremate organisatsioonide vĂ”i teiste teenustega integreerimist nĂ”udvate rakenduste puhul kaaluge ĂŒhekordse sisselogimise (SSO) juurutamist, kasutades protokolle nagu OAuth 2.0 vĂ”i SAML. Django pakub mitmeid pakette, mis lihtsustavad SSO integreerimist, nĂ€iteks `django-allauth`.
5. Auditeerimise logimine
Juurutage auditeerimise logimine, et jÀlgida kasutaja tegevust ja kasutajaandmete muudatusi. See vÔib olla kasulik turvalisuse jÀlgimiseks, vastavuse tagamiseks ja silumiseks. Paketid nagu `django-auditlog` vÔivad aidata seda protsessi automatiseerida.
KokkuvÔte
Djangos kohandatud kasutajamudelite loomine ja juurutamine pakub paindlikkust ja kontrolli, mida vajate tugevate ja skaleeritavate autentimissĂŒsteemide loomiseks, eriti globaalsete rakenduste jaoks. JĂ€rgides kĂ€esolevas juhendis toodud parimaid tavasid, saate tagada, et teie rakendus on hĂ€sti varustatud mitmekesiste kasutajanĂ”uete kĂ€sitlemiseks, andmete terviklikkuse sĂ€ilitamiseks ja turvalise ning kasutajasĂ”braliku kogemuse pakkumiseks kasutajatele ĂŒle kogu maailma. Pidage meeles oma juurutamist hoolikalt planeerida, arvestada oma kasutajate vajadustega ja seada turvalisus esikohale protsessi igas etapis. Valik `AbstractBaseUser` ja `AbstractUser` vahel sĂ”ltub vajalikust kohandamise tasemest. Oluliste muudatuste korral pakub `AbstractBaseUser` suuremat kontrolli. Lihtsate laienduste jaoks pakub `AbstractUser` sujuvamat ĂŒleminekut. PĂ”hjalik testimine on ĂŒlioluline tagamaks, et kohandatud kasutajamudel integreerub sujuvalt ĂŒlejÀÀnud teie Django rakendusega ja vastab kĂ”igile turvanĂ”uetele. Rakendage parimaid tavasid rahvusvahelistamise, lokaliseerimise ja ajavööndi kĂ€sitlemiseks, et pakkuda tĂ”eliselt globaalset kogemust. See aitab oluliselt kaasa teie rakenduse edule ja vastuvĂ”tmisele erinevatel turgudel ĂŒle kogu maailma.