Menu
CoddyTech

Autorizzazione richiesta

Fa parte della sezione Utenti e account del percorso Django di Coddy. Lezione 13 di 16.

La nuova pagina /all/ elenca le note di tutti gli utenti, per chi gestisce le richieste di assistenza. is_staff è un unico interruttore per tutto; questa pagina ha bisogno di una regola più specifica.

Per ogni modello, migrate crea quattro permessi: aggiungere, modificare, eliminare e visualizzare. Ognuno è denominato con l'etichetta dell'app e un nome in codice, come shop.change_product. Puoi assegnarli a un utente o a un gruppo nella pagina dell'utente nell'area di amministrazione. Un superutente li possiede tutti.

Un decoratore ne controlla uno:

from django.contrib.auth.decorators import permission_required


@permission_required("shop.change_product", raise_exception=True)
def edit_prices(request):
    ...

Senza raise_exception=True, un utente che non dispone del permesso viene reindirizzato alla pagina di accesso, anche se ha già effettuato l'accesso. Con questa opzione, riceve un errore 403. In una vista, request.user.has_perm("shop.change_product") verifica la stessa cosa; in un modello, {% if perms.shop.change_product %}.

challenge icon

Sfida

Medio

Consenti l'accesso a /all/ solo al personale di supporto.

  1. In notes/views.py, consenti di aprire all_notes solo agli utenti con l'autorizzazione integrata di Django per visualizzare le note. Gli altri ricevono un errore 403 Forbidden, non la pagina di accesso.
  2. In base.html, dopo il link Stats, aggiungi un link All notes a /all/, mostrato solo agli utenti con tale autorizzazione.

Apri /all/ come carol: vengono elencate tutte e tre le note. Come bob: errore 403 Forbidden. Password coddy-pass-123.

Provalo tu

from django.contrib.auth import login
from django.contrib.auth.decorators import login_not_required
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, redirect, render

from .forms import NoteForm
from .models import Note


def note_list(request):
    notes = Note.objects.filter(owner=request.user)
    return render(request, "notes/note_list.html", {"notes": notes})


def note_detail(request, pk):
    note = get_object_or_404(Note, pk=pk, owner=request.user)
    return render(request, "notes/note_detail.html", {"note": note})


def note_create(request):
    if request.method == "POST":
        form = NoteForm(request.POST)
        if form.is_valid():
            note = form.save(commit=False)
            note.owner = request.user
            note.save()
            return redirect("notes:detail", pk=note.pk)
    else:
        form = NoteForm()
    return render(request, "notes/note_form.html", {"form": form})


def note_edit(request, pk):
    note = get_object_or_404(Note, pk=pk, owner=request.user)
    if request.method == "POST":
        form = NoteForm(request.POST, instance=note)
        if form.is_valid():
            form.save()
            return redirect("notes:detail", pk=note.pk)
    else:
        form = NoteForm(instance=note)
    return render(request, "notes/note_form.html", {"form": form, "note": note})


def note_delete(request, pk):
    note = get_object_or_404(Note, pk=pk, owner=request.user)
    if request.method == "POST":
        note.delete()
        return redirect("notes:list")
    return render(request, "notes/note_confirm_delete.html", {"note": note})


@login_not_required
def signup(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect("notes:list")
    else:
        form = UserCreationForm()
    return render(request, "notes/signup.html", {"form": form})


def stats(request):
    if not request.user.is_staff:
        raise PermissionDenied
    context = {"user_count": User.objects.count(), "note_count": Note.objects.count()}
    return render(request, "notes/stats.html", context)


def all_notes(request):
    notes = Note.objects.select_related("owner")
    return render(request, "notes/all_notes.html", {"notes": notes})
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Utenti e account

Esercitati da solo: Playground Django