[PYTHON] Beschränken Sie Ansichten mithilfe des Berechtigungsmodells von Django

Django hat ein Modell namens "Berechtigung", das automatisch generiert wird, wenn Sie ein Django-Modell erstellen. Infolgedessen kann eingeschränkt werden, dass nur Benutzer mit der entsprechenden Berechtigung Tabellendaten auf dem Verwaltungsbildschirm erstellen / aktualisieren / löschen können. Dieses Mal möchte ich diese "Berechtigung" verwenden, um die Ansicht einzuschränken.

Erstellen Sie Ihre eigene "Berechtigung"

Erstellen wir eine neue, ohne die vorhandenen Berechtigungsdaten zu verwenden.

Angabe von "ContentType"

Für das "Berechtigungs" -Modell müssen Sie "ContentType" als externen Schlüssel angeben, daher muss ein entsprechender "ContentType" vorhanden sein. Ich denke, Sie können den "ContentType" der Anwendung angeben, die die Ansicht hat, die Sie einschränken möchten, aber Sie können Ihre eigene erstellen.

from django.contrib.contenttypes.models import ContentType


ContentType.objects.create(
    app_label='app_label', name='name', model='model')

Der Anwendungsname wird als "app_label" angegeben. Mit anderen Worten, es ist das Ende des Modulnamens, der in "INSTALLED_APPS" der Einstellungen angegeben ist.

Erstellen von Berechtigungsdaten

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType


content_type = ContentType.objects.get(
    app_label='app_label', name='name', model='model')

Permission.objects.create(
    content_type_id=content_type.id, name='name', codename='codename')

"Name" ist ein Anzeigename für Berechtigungen wie "Kann Berechtigung hinzufügen" und "Codename" ist ein definierter Name wie "Add_Permission".

Gewähren Sie dem Benutzer "Berechtigung"

Sie können Berechtigungen über den Benutzerbearbeitungsbildschirm des Django-Verwaltungsbildschirms erteilen.

perm.png

Finden Sie heraus, ob ein Benutzer eine bestimmte Berechtigung hat

Sie können überprüfen, ob Sie über eine bestimmte Berechtigung verfügen, indem Sie "has_perm" der "User" -Instanz aufrufen. Übergeben Sie es als Argument in der Form "app_label.codename". Die Berechtigung zum Hinzufügen eines Benutzers lautet beispielsweise "auth.add_user".

from django.contrib.auth import get_user_model


User = get_user_model()
user = User.objects.get(pk=1)

user.has_perm('{app_label}.{codename}'.format(
    app_label='app_label', codename='codename'))

Sicht mit Dekorateur einschränken

(Zusätzliche Bemerkungen)

Wenn Sie in Django eine Ansicht erstellen möchten, die nur Benutzer sehen können, gibt es eine Möglichkeit, einen Dekorateur zu verwenden.

from django.contrib.admin.views.decorators import staff_member_required
from django.utils.decorators import method_decorator
from django.views.generic.base import View


class SpamView(View):
    @method_decorator(staff_member_required)
    def dispatch(self, *args, **kwargs):
        return super(SpamView, self).dispatch(*args, **kwargs)

Indem wir dies nachahmen, erstellen wir eine Ansicht, die nur von Benutzern mit bestimmten Berechtigungen angezeigt werden kann.

decorators.py


from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test


def get_permission_deco(permission_codename,
                        redirect_field_name=REDIRECT_FIELD_NAME,
                        login_url='admin:login'):
    def deco(view_func):
        return user_passes_test(
            lambda u: u.has_perm(permission_codename),
            login_url=login_url,
            redirect_field_name=redirect_field_name
        )(view_func)
    return deco

view.py


from django.utils.decorators import method_decorator
from django.views.generic.base import View

from .decorators import get_permission_deco


class EggView(View):
    @method_decorator(get_permission_deco('app_label.codename'))
    def dispatch(self, *args, **kwargs):
        return super(EggView, self).dispatch(*args, **kwargs)

(Zusatz)

In Django gab es eine "Erlaubnis erforderlich" ohne Tricks. https://docs.djangoproject.com/ja/1.10/topics/auth/default/#the-permission-required-decorator

Begrenzen Sie Vorlagen mit benutzerdefinierten Tags

Die Details zum Erstellen eines benutzerdefinierten Tags gehen über den Rahmen dieses Artikels hinaus. Daher werde ich es weglassen. Ich denke jedoch, dass es möglich ist, die Vorlage mithilfe eines benutzerdefinierten Tags einzuschränken. Daher werde ich ein Beispiel geben.

perm_extra.py


from django import template


register = template.Library()

@register.filter(name='has_perm')
def has_perm(user, permission_name):
    return user.has_perm(permission_name)

{% load perm_extra %}

{% if user|has_perm:'app_label.codename' %}
  <a href="/path">Gehen Sie zur Bearbeitungsseite</a>
{% else %}
  <del>Gehen Sie zur Bearbeitungsseite</del>(Nicht genehmigt)
{% endif %}

Recommended Posts

Beschränken Sie Ansichten mithilfe des Berechtigungsmodells von Django
Vorteile der Verwendung von Slugfield im Django-Modell
Djangos Modellform war unglaublich.
Vorteile der Verfeinerung des Django-Modells
Versuchen Sie es mit der Vorlagenfunktion von Django