Avage Django õiguste süsteemi jõud selle põhjaliku autoriseerimisjuhendiga. Õppige, kuidas määratleda, rakendada ja hallata õigusi turvaliste ja skaleeritavate veebirakenduste jaoks.
Django õiguste süsteemi valdamine: põhjalik juhend autoriseerimiseks
Veebiarenduse maailmas on turvalisus ülimalt tähtis. Django, võimas Pythoni veebiraamistik, pakub jõulist ja paindlikku õiguste süsteemi, et hallata kasutaja autoriseerimist ja kaitsta teie rakenduse ressursse. See põhjalik juhend süveneb Django õiguste süsteemi keerukustesse, pakkudes praktilisi näiteid ja parimaid tavasid turvalise ja skaleeritava autoriseerimise rakendamiseks teie Django projektides.
Autentimise ja autoriseerimise mõistmine
Enne Django õiguste süsteemi üksikasjadesse sukeldumist on oluline mõista erinevust autentimise ja autoriseerimise vahel:
- Autentimine: Kontrollib kasutaja identiteeti. See vastab küsimusele "Kes sa oled?". Tavaliselt käsitletakse seda kasutajanime/parooli kombinatsioonide, sotsiaalsete sisselogimiste või muude identiteediteenuste kaudu.
- Autoriseerimine: Määrab, mida autentitud kasutajal on lubatud teha. See vastab küsimusele "Mida sul on lubatud teha?". Siin tuleb mängu Django õiguste süsteem.
Autentimine toimub *enne* autoriseerimist. Peate teadma, kes kasutaja on, enne kui saate kindlaks määrata, millele tal on lubatud juurde pääseda või mida muuta.
Django sisseehitatud õiguste süsteem
Django pakub sisseehitatud õiguste süsteemi, mis põhineb mudelitel, kasutajatel ja gruppidel. Seda on lihtne kasutada põhiliste autoriseerimisvajaduste jaoks, kuid seda saab laiendada ja kohandada, et käsitleda keerukamaid stsenaariume.
Mudeli õigused
Django loob automaatselt iga mudeli jaoks vaikeõigused, mis võimaldavad teil kontrollida, kes saab selle mudeli eksemplare luua, lugeda, värskendada ja kustutada. Need õigused on:
- add_[mudelinimi]: Lubab mudeli uute eksemplaride loomist.
- change_[mudelinimi]: Lubab mudeli olemasolevate eksemplaride värskendamist.
- delete_[mudelinimi]: Lubab mudeli eksemplaride kustutamist.
- view_[mudelinimi]: Lubab mudeli eksemplaride vaatamist (Django 3.1+).
Näiteks, kui teil on mudel nimega `Article`, loob Django järgmised õigused:
- `add_article`
- `change_article`
- `delete_article`
- `view_article`
Kasutajad ja grupid
Django sisseehitatud autentimissüsteem pakub õiguste haldamiseks kahte põhiüksust:
- Kasutajad: Individuaalsed kasutajakontod teie rakenduses.
- Grupid: Kasutajate kogumid, kellel on ühised õigused. See on jätkusuutlikum viis õiguste rakendamiseks paljudele kasutajatele korraga.
Saate määrata õigusi otse kasutajatele või, sagedamini, määrata õigusi gruppidele ja seejärel lisada kasutajaid nendesse gruppidesse.
Näide: Artiklite õiguste haldamine
Oletame, et teil on blogirakendus mudeliga `Article`. Soovite lubada ainult teatud kasutajatel luua uusi artikleid, muuta olemasolevaid artikleid ja kustutada artikleid. Siin on, kuidas saate seda rakendada Django sisseehitatud õiguste süsteemi abil:
- Looge grupid: Looge Django administraatoripaneelis grupid, nagu "Toimetaja" ja "Autor".
- Määrake õigused: Määrake grupile "Toimetaja" õigused `add_article`, `change_article` ja `delete_article`. Määrake grupile "Autor" ainult õigus `add_article`.
- Lisage kasutajad gruppidesse: Lisage sobivad kasutajad gruppidesse "Toimetaja" ja "Autor".
Nüüd on grupi "Toimetaja" kasutajatel täielik juurdepääs artiklite haldamiseks, samas kui grupi "Autor" kasutajad saavad ainult uusi artikleid luua.
Õiguste rakendamine vaadetes
Kui olete oma õigused määratlenud ja need kasutajatele või gruppidele määranud, peate need õigused oma vaadetes jõustama. Django pakub selleks mitmeid võimalusi:
`permission_required` dekoraator
Dekoraator `@permission_required` on lihtne viis piirata juurdepääsu vaatele kasutajatele, kellel on konkreetsed õigused.
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.add_article')
def create_article(request):
# Ainult kasutajad, kellel on 'myapp.add_article' õigus, saavad sellele vaatele juurde pääseda
return render(request, 'myapp/create_article.html')
Kui kasutaja, kellel pole nõutavat õigust, proovib vaatele juurde pääseda, suunatakse ta sisselogimislehele või saab 403 keelatud vea, olenevalt teie seadetest.
`LoginRequiredMixin` ja `PermissionRequiredMixin` (klassipõhiste vaadete jaoks)
Klassipõhiste vaadete jaoks saate kasutada `LoginRequiredMixin` ja `PermissionRequiredMixin` autentimise ja autoriseerimise jõustamiseks:
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
model = Article
fields = ['title', 'content']
permission_required = 'myapp.add_article'
template_name = 'myapp/article_form.html'
See näide näitab, kuidas piirata juurdepääsu vaatele `ArticleCreateView` ainult autentitud kasutajatele, kellel on õigus `add_article`.
Õiguste käsitsi kontrollimine
Saate ka oma vaadetes õigusi käsitsi kontrollida, kasutades kasutajaobjektil meetodit `has_perm()`:
from django.shortcuts import render, redirect
def update_article(request, article_id):
article = Article.objects.get(pk=article_id)
if request.user.has_perm('myapp.change_article', article):
# Kasutajal on õigus artiklit värskendada
# Rakendage siin värskendamise loogika
return render(request, 'myapp/update_article.html', {'article': article})
else:
# Kasutajal pole õigust
return render(request, 'myapp/permission_denied.html')
Selles näites kontrollime, kas kasutajal on konkreetse `article` eksemplari jaoks õigus `change_article`. See võimaldab teil rakendada objekti tasandi õigusi, kus õigused antakse sõltuvalt konkreetsest juurdepääsetavast objektist.
Kohandatud õigused
Django sisseehitatud õigused on sageli piisavad põhiliste autoriseerimisvajaduste jaoks. Keerukamate rakenduste puhul peate võib-olla määratlema kohandatud õigused, et kajastada konkreetset äri loogikat või juurdepääsu kontrolli nõudeid.
Kohandatud õiguste määratlemine mudelites
Saate oma mudeli klassis `Meta` määratleda kohandatud õigused, kasutades valikut `permissions`:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
published_date = models.DateTimeField(blank=True, null=True)
class Meta:
permissions = [
('can_publish_article', 'Saab artikli avaldada'),
('can_comment_article', 'Saab artiklit kommenteerida'),
]
See näide määratleb kaks kohandatud õigust: `can_publish_article` ja `can_comment_article`. Need õigused luuakse automaatselt, kui käivitate käsu `python manage.py migrate`.
Kohandatud õiguste kasutamine
Kui olete oma kohandatud õigused määratlenud, saate neid kasutada samamoodi nagu sisseehitatud õigusi, kasutades dekoraatorit `@permission_required`, `PermissionRequiredMixin` või meetodit `has_perm()`.
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.can_publish_article')
def publish_article(request, article_id):
# Ainult kasutajad, kellel on 'myapp.can_publish_article' õigus, saavad sellele vaatele juurde pääseda
article = Article.objects.get(pk=article_id)
article.published_date = timezone.now()
article.save()
return render(request, 'myapp/article_published.html', {'article': article})
Objekti tasandi õigused
Objekti tasandi õigused võimaldavad teil kontrollida juurdepääsu mudeli konkreetsetele eksemplaridele, selle asemel, et anda üldisi õigusi kõigi eksemplaride jaoks. See on oluline rakenduste jaoks, kus kasutajad peaksid saama juurde pääseda või muuta ainult neid ressursse, mis neile kuuluvad või millele neile on selgesõnaliselt juurdepääs antud.
Objekti tasandi õiguste rakendamine
Objekti tasandi õiguste rakendamiseks Djangos on mitu võimalust:
- Õiguste käsitsi kontrollimine: Nagu varem näidatud, saate kasutada meetodit `has_perm()` õiguste kontrollimiseks konkreetse objekti eksemplari jaoks.
- Kolmandate osapoolte teekide kasutamine: Teegid nagu `django-guardian` pakuvad struktureeritumaid ja taaskasutatavamaid viise objekti tasandi õiguste haldamiseks.
Näide: Kasutades `django-guardian`
`django-guardian` lihtsustab objekti tasandi õiguste määramist ja kontrollimist. Siin on põhinäide:
- Installige `django-guardian`: `pip install django-guardian`
- Konfigureerige `settings.py`: Lisage `INSTALLED_APPS` oma `'guardian'` ja konfigureerige vajalikud autentimise taustaprogrammid.
- Määrake õigused: Kasutage funktsiooni `assign_perm()` õiguste andmiseks kasutajatele või gruppidele konkreetsete objektide jaoks.
- Kontrollige õigusi: Kasutage funktsiooni `has_perm()` kontrollimaks, kas kasutajal on konkreetse objekti jaoks konkreetne õigus.
from guardian.shortcuts import assign_perm, get_perms
# Määrake kasutajale konkreetse artikli jaoks õigus 'change_article'
assign_perm('change_article', user, article)
# Kontrollige, kas kasutajal on artikli jaoks õigus 'change_article'
if user.has_perm('change_article', article):
# Kasutajal on õigus
pass
`django-guardian` pakub ka `PermissionListMixin` klassipõhiste vaadete jaoks, muutes lihtsamaks objektide loendi kuvamise, millele kasutajal on juurdepääsuks õigus.
Django REST Framework õigused
Kui loote REST API-sid Django REST Frameworkiga, peate kasutama selle õiguste klasse, et kontrollida juurdepääsu oma API lõpp-punktidele. DRF pakub mitmeid sisseehitatud õiguste klasse, sealhulgas:
- `AllowAny`: Lubab piiramatu juurdepääsu API lõpp-punktile.
- `IsAuthenticated`: Nõuab, et kasutaja oleks autentitud, et API lõpp-punktile juurde pääseda.
- `IsAdminUser`: Nõuab, et kasutaja oleks administraator, et API lõpp-punktile juurde pääseda.
- `IsAuthenticatedOrReadOnly`: Lubab mitteautentitud kasutajatele ainult lugemisõiguse, kuid nõuab autentimist kirjutamisõiguse jaoks.
- `DjangoModelPermissions`: Kasutab juurdepääsu kontrollimiseks Django standardseid mudeli õigusi.
- `DjangoObjectPermissions`: Kasutab `django-guardian` objekti tasandi õiguste jõustamiseks.
DRF õiguste klasside kasutamine
Saate määrata vaate õiguste klassid atribuudi `permission_classes` abil:
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
class ArticleList(generics.ListCreateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = [IsAuthenticated]
See näide piirab juurdepääsu API lõpp-punktile `ArticleList` ainult autentitud kasutajatele.
Kohandatud DRF õigused
Saate luua ka kohandatud DRF õiguste klasse keerukama autoriseerimisloogika rakendamiseks. Kohandatud õiguste klass peaks pärima klassist `rest_framework.permissions.BasePermission` ja alistama meetodid `has_permission()` ja/või `has_object_permission()`.
from rest_framework import permissions
class IsAuthorOrReadOnly(permissions.BasePermission):
"""
Custom permission to only allow authors of an object to edit it.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS:
return True
# Instance must have an attribute named `author`.
return obj.author == request.user
See näide määratleb kohandatud õiguste klassi, mis lubab ainult artikli autoril seda muuta, võimaldades samal ajal kõigile lugemisõiguse.
Turvalisuse parimad tavad
Tugeva õiguste süsteemi rakendamine on teie Django rakenduse turvamise jaoks ülioluline. Siin on mõned turvalisuse parimad tavad, mida meeles pidada:
- Vähima privileegi põhimõte: Andke kasutajatele ainult minimaalsed õigused, mida nad oma ülesannete täitmiseks vajavad. Vältige mittevajalike õiguste määramist.
- Kasutage gruppe: Hallake õigusi gruppide kaudu, selle asemel, et määrata õigusi otse üksikutele kasutajatele. See lihtsustab haldust ja vähendab vigade ohtu.
- Regulaarsed auditid: Vaadake perioodiliselt üle oma õiguste seadeid, et tagada nende asjakohasus ja et volitamata juurdepääsu ei anta.
- Sisendi puhastamine: Puhastage alati kasutaja sisend, et vältida süstimisrünnakuid, mis võivad teie õiguste süsteemist mööda minna.
- Põhjalik testimine: Testige oma õiguste süsteemi põhjalikult, et tagada selle ootuspärane käitumine ja et ei esineks ühtegi haavatavust. Kirjutage automatiseeritud teste õiguste kontrollide kontrollimiseks.
- Hoidke end kursis: Hoidke oma Django raamistikku ja seotud teeke ajakohasena, et saada kasu uusimatest turvapaikadest ja veaparandustest.
- Kaaluge sisu turvapoliitikat (CSP): CSP aitab vältida saidiülest skriptimist (XSS) rünnakuid, mida saab kasutada autoriseerimismehhanismidest mööda hiilimiseks.
Rahvusvahelistumise kaalutlused
Ülemaailmsele publikule mõeldud õiguste süsteemi kavandamisel kaaluge järgmisi rahvusvahelistumise aspekte:
- Rollinimed: Kui teie rakendus kasutab rolle (nt Toimetaja, Autor, Moderaator), tagage, et need rollinimed oleksid hõlpsasti tõlgitavad ja kultuuriliselt sobivad kõigi toetatud keelte jaoks. Kaaluge rollinimede keelespetsiifiliste variatsioonide kasutamist.
- Kasutajaliides: Kujundage oma kasutajaliides nii, et see oleks kohandatav erinevate keelte ja kultuuriliste konventsioonidega. See hõlmab kuupäeva/kellaaja vorminguid, numbrite vorminguid ja teksti suunda.
- Ajavööndid: Arvestage erinevate ajavöönditega, kui annate või tühistate õigusi ajatundlike sündmuste põhjal. Salvestage ajatemplid UTC-s ja teisendage need kasutaja kohalikuks ajavööndiks kuvamiseks.
- Andmekaitse eeskirjad: Olge teadlik andmekaitse eeskirjadest erinevates riikides (nt GDPR Euroopas, CCPA Californias). Rakendage sobivaid nõusolekumehhanisme ja andmekaitsemeetmeid.
- Juurdepääsetavus: Veenduge, et teie õiguste süsteem oleks juurdepääsetav puuetega kasutajatele, järgides juurdepääsetavuse standardeid nagu WCAG.
Järeldus
Django õiguste süsteem pakub võimsat ja paindlikku raamistikku autoriseerimise haldamiseks teie veebirakendustes. Mõistes sisseehitatud funktsioone, kohandatud õigusi, objekti tasandi õigusi ja turvalisuse parimaid tavasid, saate luua turvalisi ja skaleeritavaid rakendusi, mis kaitsevad teie väärtuslikke ressursse. Pidage meeles, et kohandage oma õiguste süsteemi vastavalt oma rakenduse konkreetsetele vajadustele ning vaadake oma seaded regulaarselt üle ja värskendage neid, et tagada nende tõhusus.
See juhend annab põhjaliku ülevaate Django õiguste süsteemist. Keerukamate rakenduste ehitamisel võite kohata keerukamaid stsenaariume. Ärge kartke täiendavate juhiste saamiseks uurida Django dokumentatsiooni ja kogukonna ressursse.