Ota Djangon käyttöoikeusjärjestelmän teho käyttöön tällä perusteellisella valtuutusoppaalla. Opi määrittämään, toteuttamaan ja hallitsemaan käyttöoikeuksia turvallisia ja skaalautuvia verkkosovelluksia varten.
Djangon käyttöoikeusjärjestelmän hallinta: Kattava opas valtuutukseen
Verkkokehityksen maailmassa turvallisuus on ensiarvoisen tärkeää. Django, tehokas Python-verkkokehys, tarjoaa vankan ja joustavan käyttöoikeusjärjestelmän käyttäjien valtuutuksen hallintaan ja sovelluksesi resurssien suojaamiseen. Tämä kattava opas perehtyy Djangon käyttöoikeusjärjestelmän monimutkaisuuksiin tarjoten käytännön esimerkkejä ja parhaita käytäntöjä turvallisen ja skaalautuvan valtuutuksen toteuttamiseen Django-projekteissasi.
Tunnistautumisen ja valtuutuksen ymmärtäminen
Ennen kuin sukellamme Djangon käyttöoikeusjärjestelmän yksityiskohtiin, on tärkeää ymmärtää tunnistautumisen ja valtuutuksen välinen ero:
- Tunnistautuminen: Vahvistaa käyttäjän henkilöllisyyden. Se vastaa kysymykseen "Kuka sinä olet?". Tämä hoidetaan tyypillisesti käyttäjätunnus/salasana-yhdistelmien, sosiaalisten kirjautumisten tai muiden identiteettipalveluiden kautta.
- Valtuutus: Määrittää, mitä tunnistautunut käyttäjä saa tehdä. Se vastaa kysymykseen "Mitä sinulla on lupa tehdä?". Tässä kohtaa Djangon käyttöoikeusjärjestelmä astuu kuvaan.
Tunnistautuminen tapahtuu *ennen* valtuutusta. Sinun on tiedettävä, kuka käyttäjä on, ennen kuin voit määrittää, mitä hänellä on lupa käyttää tai muokata.
Djangon sisäänrakennettu käyttöoikeusjärjestelmä
Django tarjoaa sisäänrakennetun käyttöoikeusjärjestelmän, joka perustuu malleihin, käyttäjiin ja ryhmiin. Se on helppokäyttöinen peruskäyttöoikeustarpeisiin, mutta sitä voidaan laajentaa ja mukauttaa monimutkaisempien skenaarioiden käsittelyyn.
Mallin käyttöoikeudet
Django luo automaattisesti oletuskäyttöoikeudet jokaiselle mallille, jolloin voit hallita, kuka voi luoda, lukea, päivittää ja poistaa kyseisen mallin esiintymiä. Nämä käyttöoikeudet ovat:
- add_[mallinimi]: Sallii mallin uusien esiintymien luomisen.
- change_[mallinimi]: Sallii mallin olemassa olevien esiintymien päivittämisen.
- delete_[mallinimi]: Sallii mallin esiintymien poistamisen.
- view_[mallinimi]: Sallii mallin esiintymien tarkastelun (Django 3.1+).
Jos sinulla on esimerkiksi malli nimeltä `Article`, Django luo seuraavat käyttöoikeudet:
- `add_article`
- `change_article`
- `delete_article`
- `view_article`
Käyttäjät ja ryhmät
Djangon sisäänrakennettu tunnistautumisjärjestelmä tarjoaa kaksi perustavaa laatua olevaa kokonaisuutta käyttöoikeuksien hallintaan:
- Käyttäjät: Yksittäiset käyttäjätilit sovelluksessasi.
- Ryhmät: Käyttäjäkokoelmat, joilla on jaetut käyttöoikeudet. Tämä on helpompi tapa ylläpitää käyttöoikeuksia monille käyttäjille samanaikaisesti.
Voit määrittää käyttöoikeuksia suoraan käyttäjille tai yleisemmin määrittää käyttöoikeuksia ryhmille ja lisätä sitten käyttäjiä näihin ryhmiin.
Esimerkki: Artikkelien käyttöoikeuksien hallinta
Oletetaan, että sinulla on blogisovellus, jossa on `Article`-malli. Haluat sallia vain tietyille käyttäjille uusien artikkelien luomisen, olemassa olevien artikkelien muokkaamisen ja artikkelien poistamisen. Tässä on, miten voit toteuttaa tämän Djangon sisäänrakennetun käyttöoikeusjärjestelmän avulla:
- Luo ryhmiä: Luo ryhmiä, kuten "Toimittaja" ja "Kirjoittaja" Djangon hallintapaneelissa.
- Määritä käyttöoikeuksia: Määritä `add_article`, `change_article` ja `delete_article` -käyttöoikeudet "Toimittaja"-ryhmälle. Määritä vain `add_article` -käyttöoikeus "Kirjoittaja"-ryhmälle.
- Lisää käyttäjiä ryhmiin: Lisää sopivat käyttäjät "Toimittaja"- ja "Kirjoittaja"-ryhmiin.
Nyt "Toimittaja"-ryhmän käyttäjillä on täysi pääsy artikkelien hallintaan, kun taas "Kirjoittaja"-ryhmän käyttäjät voivat luoda vain uusia artikkeleita.
Käyttöoikeuksien toteuttaminen näkymissä
Kun olet määrittänyt käyttöoikeudet ja määrittänyt ne käyttäjille tai ryhmille, sinun on pakotettava nämä käyttöoikeudet näkymissäsi. Django tarjoaa useita tapoja tehdä tämä:
`permission_required`-koriste
`@permission_required`-koriste on yksinkertainen tapa rajoittaa pääsy näkymään käyttäjille, joilla on tietyt käyttöoikeudet.
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.add_article')
def create_article(request):
# Vain käyttäjät, joilla on 'myapp.add_article' -käyttöoikeus, voivat käyttää tätä näkymää
return render(request, 'myapp/create_article.html')
Jos käyttäjä ilman vaadittavaa käyttöoikeutta yrittää käyttää näkymää, hänet ohjataan kirjautumissivulle tai hän saa 403 Forbidden -virheen asetuksistasi riippuen.
`LoginRequiredMixin` ja `PermissionRequiredMixin` (luokkapohjaisille näkymille)
Luokkapohjaisissa näkymissä voit käyttää `LoginRequiredMixin`- ja `PermissionRequiredMixin`-luokkia tunnistautumisen ja valtuutuksen pakottamiseen:
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'
Tämä esimerkki osoittaa, miten pääsy `ArticleCreateView`-näkymään rajoitetaan vain tunnistautuneille käyttäjille, joilla on `add_article`-käyttöoikeus.
Käyttöoikeuksien tarkistaminen manuaalisesti
Voit myös tarkistaa käyttöoikeudet manuaalisesti näkymissäsi käyttämällä `has_perm()`-metodia käyttäjäobjektissa:
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):
# Käyttäjällä on lupa päivittää artikkeli
# Toteuta päivityslogiikka tähän
return render(request, 'myapp/update_article.html', {'article': article})
else:
# Käyttäjällä ei ole lupaa
return render(request, 'myapp/permission_denied.html')
Tässä esimerkissä tarkistamme, onko käyttäjällä `change_article`-käyttöoikeus tietylle `article`-esiintymälle. Tämän avulla voit toteuttaa objektitason käyttöoikeudet, joissa käyttöoikeudet myönnetään tietyn käytettävän objektin perusteella.
Mukautetut käyttöoikeudet
Djangon sisäänrakennetut käyttöoikeudet riittävät usein peruskäyttöoikeustarpeisiin. Monimutkaisemmissa sovelluksissa saatat kuitenkin joutua määrittämään mukautettuja käyttöoikeuksia vastaamaan tiettyä liiketoimintalogiikkaa tai pääsynhallintavaatimuksia.
Mukautettujen käyttöoikeuksien määrittäminen malleissa
Voit määrittää mukautettuja käyttöoikeuksia mallisi `Meta`-luokassa käyttämällä `permissions`-vaihtoehtoa:
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', 'Voi julkaista artikkelin'),
('can_comment_article', 'Voi kommentoida artikkelia'),
]
Tämä esimerkki määrittää kaksi mukautettua käyttöoikeutta: `can_publish_article` ja `can_comment_article`. Nämä käyttöoikeudet luodaan automaattisesti, kun suoritat `python manage.py migrate`.
Mukautettujen käyttöoikeuksien käyttäminen
Kun olet määrittänyt mukautetut käyttöoikeudet, voit käyttää niitä samalla tavalla kuin sisäänrakennettuja käyttöoikeuksia käyttämällä `@permission_required`-koristetta, `PermissionRequiredMixin`-luokkaa tai `has_perm()`-metodia.
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):
# Vain käyttäjät, joilla on 'myapp.can_publish_article' -käyttöoikeus, voivat käyttää tätä näkymää
article = Article.objects.get(pk=article_id)
article.published_date = timezone.now()
article.save()
return render(request, 'myapp/article_published.html', {'article': article})
Objektitason käyttöoikeudet
Objektitason käyttöoikeuksien avulla voit hallita pääsyä mallin tiettyihin esiintymiin sen sijaan, että myöntäisit yleisiä käyttöoikeuksia kaikille esiintymille. Tämä on välttämätöntä sovelluksille, joissa käyttäjien tulisi voida käyttää tai muokata vain resursseja, jotka he omistavat tai joihin heille on nimenomaisesti myönnetty pääsy.
Objektitason käyttöoikeuksien toteuttaminen
Objektitason käyttöoikeuksia voidaan toteuttaa Djangossa useilla tavoilla:
- Käyttöoikeuksien tarkistaminen manuaalisesti: Kuten aiemmin osoitettiin, voit käyttää `has_perm()`-metodia käyttöoikeuksien tarkistamiseen tietylle objektin esiintymälle.
- Kolmannen osapuolen kirjastojen käyttäminen: Kirjastot, kuten `django-guardian`, tarjoavat jäsennellympiä ja uudelleenkäytettäviä tapoja hallita objektitason käyttöoikeuksia.
Esimerkki: `django-guardian`-kirjaston käyttäminen
`django-guardian` yksinkertaistaa objektitason käyttöoikeuksien määrittämistä ja tarkistamista. Tässä on perusesimerkki:
- Asenna `django-guardian`: `pip install django-guardian`
- Määritä `settings.py`: Lisää `'guardian'` kohtaan `INSTALLED_APPS` ja määritä tarvittavat tunnistautumisen taustajärjestelmät.
- Määritä käyttöoikeuksia: Käytä `assign_perm()`-funktiota käyttöoikeuksien myöntämiseen käyttäjille tai ryhmille tietyille objekteille.
- Tarkista käyttöoikeudet: Käytä `has_perm()`-funktiota sen tarkistamiseen, onko käyttäjällä tietty käyttöoikeus tietylle objektille.
from guardian.shortcuts import assign_perm, get_perms
# Määritä 'change_article' -käyttöoikeus käyttäjälle tietylle artikkelille
assign_perm('change_article', user, article)
# Tarkista, onko käyttäjällä 'change_article' -käyttöoikeus artikkelille
if user.has_perm('change_article', article):
# Käyttäjällä on lupa
pass
`django-guardian` tarjoaa myös `PermissionListMixin`-luokan luokkapohjaisille näkymille, mikä helpottaa niiden objektien luettelon näyttämistä, joihin käyttäjällä on käyttöoikeus.
Django REST Framework -käyttöoikeudet
Jos luot REST-sovellusliittymiä Django REST Frameworkin avulla, sinun on käytettävä sen käyttöoikeusluokkia sovellusliittymäsi päätepisteiden käytön hallintaan. DRF tarjoaa useita sisäänrakennettuja käyttöoikeusluokkia, mukaan lukien:
- `AllowAny`: Sallii rajoittamattoman pääsyn sovellusliittymän päätepisteeseen.
- `IsAuthenticated`: Vaatii, että käyttäjä on tunnistautunut käyttääkseen sovellusliittymän päätepistettä.
- `IsAdminUser`: Vaatii, että käyttäjä on järjestelmänvalvoja käyttääkseen sovellusliittymän päätepistettä.
- `IsAuthenticatedOrReadOnly`: Sallii vain luku -pääsyn tunnistamattomille käyttäjille, mutta vaatii tunnistautumisen kirjoitusoikeutta varten.
- `DjangoModelPermissions`: Käyttää Djangon tavallisia mallin käyttöoikeuksia käytön hallintaan.
- `DjangoObjectPermissions`: Käyttää `django-guardian`-kirjastoa objektitason käyttöoikeuksien pakottamiseen.
DRF-käyttöoikeusluokkien käyttäminen
Voit määrittää näkymän käyttöoikeusluokat käyttämällä `permission_classes`-attribuuttia:
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]
Tämä esimerkki rajoittaa pääsyn `ArticleList`-sovellusliittymän päätepisteeseen vain tunnistautuneille käyttäjille.
Mukautetut DRF-käyttöoikeudet
Voit myös luoda mukautettuja DRF-käyttöoikeusluokkia monimutkaisemman valtuutuslogiikan toteuttamiseen. Mukautetun käyttöoikeusluokan tulisi periä `rest_framework.permissions.BasePermission`-luokka ja ohittaa `has_permission()`- ja/tai `has_object_permission()`-metodit.
from rest_framework import permissions
class IsAuthorOrReadOnly(permissions.BasePermission):
"""
Mukautettu käyttöoikeus, joka sallii vain objektin tekijöiden muokata sitä.
"""
def has_object_permission(self, request, view, obj):
# Lukuoikeudet sallitaan mille tahansa pyynnölle,
# joten sallimme aina GET-, HEAD- tai OPTIONS-pyynnöt.
if request.method in permissions.SAFE_METHODS:
return True
# Esiintymällä on oltava attribuutti nimeltä `author`.
return obj.author == request.user
Tämä esimerkki määrittää mukautetun käyttöoikeusluokan, joka sallii vain artikkelin tekijän muokata sitä, mutta sallii lukuoikeuden kenelle tahansa.
Turvallisuuden parhaat käytännöt
Vankan käyttöoikeusjärjestelmän toteuttaminen on ratkaisevan tärkeää Django-sovelluksesi suojaamiseksi. Tässä on joitain turvallisuuden parhaita käytäntöjä, jotka on syytä pitää mielessä:- Vähiten oikeuksia -periaate: Myönnä käyttäjille vain vähimmäisoikeudet, joita he tarvitsevat tehtäviensä suorittamiseen. Vältä tarpeettomien käyttöoikeuksien määrittämistä.
- Käytä ryhmiä: Hallitse käyttöoikeuksia ryhmien kautta sen sijaan, että määrität käyttöoikeuksia suoraan yksittäisille käyttäjille. Tämä yksinkertaistaa hallintoa ja vähentää virheiden riskiä.
- Säännölliset auditoinnit: Tarkista käyttöoikeusasetuksesi säännöllisesti varmistaaksesi, että ne ovat edelleen tarkoituksenmukaisia ja että luvatonta pääsyä ei myönnetä.
- Puhdista syöte: Puhdista aina käyttäjän syöte estääksesi injektiohyökkäykset, jotka voivat ohittaa käyttöoikeusjärjestelmäsi.
- Testaa perusteellisesti: Testaa käyttöoikeusjärjestelmäsi perusteellisesti varmistaaksesi, että se toimii odotetulla tavalla ja ettei haavoittuvuuksia ole. Kirjoita automatisoituja testejä käyttöoikeustarkistusten varmentamiseksi.
- Pysy ajan tasalla: Pidä Django-kehyksesi ja siihen liittyvät kirjastot ajan tasalla, jotta voit hyötyä uusimmista tietoturvakorjauksista ja virhekorjauksista.
- Harkitse sisällön suojauskäytäntöä (CSP): CSP voi auttaa estämään sivustojen välisiä komentosarjahyökkäyksiä (XSS), joita voidaan käyttää valtuutusmekanismien ohittamiseen.
Kansainvälistymisen huomioiminen
Kun suunnittelet käyttöoikeusjärjestelmääsi globaalille yleisölle, ota huomioon seuraavat kansainvälistymisnäkökohdat:
- Roolien nimet: Jos sovelluksesi käyttää rooleja (esim. toimittaja, kirjoittaja, moderaattori), varmista, että nämä roolien nimet ovat helposti käännettävissä ja kulttuurisesti sopivia kaikille tuetuille kielille. Harkitse kielikohtaisten muunnelmien käyttämistä roolien nimissä.
- Käyttöliittymä: Suunnittele käyttöliittymäsi mukautumaan eri kieliin ja kulttuurisiin käytäntöihin. Tähän sisältyy päivämäärä-/aikaformaatit, numeroformaatit ja tekstin suunta.
- Aikavyöhykkeet: Ota huomioon eri aikavyöhykkeet, kun myönnät tai peruutat käyttöoikeuksia aikaherkkien tapahtumien perusteella. Tallenna aikaleimat UTC-muodossa ja muunna ne käyttäjän paikalliseen aikavyöhykkeeseen näyttöä varten.
- Tietosuojamääräykset: Ole tietoinen eri maiden tietosuojamääräyksistä (esim. GDPR Euroopassa, CCPA Kaliforniassa). Toteuta asianmukaiset suostumusmekanismit ja tietosuojatoimenpiteet.
- Saavutettavuus: Varmista, että käyttöoikeusjärjestelmäsi on vammaisten käyttäjien käytettävissä ja että se noudattaa saavutettavuusstandardeja, kuten WCAG.
Johtopäätös
Djangon käyttöoikeusjärjestelmä tarjoaa tehokkaan ja joustavan kehyksen valtuutuksen hallintaan verkkosovelluksissasi. Ymmärtämällä sisäänrakennetut ominaisuudet, mukautetut käyttöoikeudet, objektitason käyttöoikeudet ja turvallisuuden parhaat käytännöt voit rakentaa turvallisia ja skaalautuvia sovelluksia, jotka suojaavat arvokkaita resurssejasi. Muista mukauttaa käyttöoikeusjärjestelmäsi sovelluksesi erityistarpeisiin ja tarkistaa ja päivittää asetuksiasi säännöllisesti varmistaaksesi, että ne pysyvät tehokkaina.
Tämä opas tarjoaa kattavan yleiskatsauksen Djangon käyttöoikeusjärjestelmästä. Kun rakennat monimutkaisempia sovelluksia, saatat kohdata edistyneempiä skenaarioita. Älä epäröi tutustua Djangon dokumentaatioon ja yhteisön resursseihin saadaksesi lisäohjeita.