[PYTHON] Limiter les vues à l'aide du modèle d'autorisation de Django

Django a un modèle appelé Permission, qui est automatiquement généré lorsque vous créez un modèle Django. Par conséquent, il est possible de limiter le fait que seuls les utilisateurs disposant de l'autorité correspondante peuvent créer, mettre à jour et supprimer des données de table sur l'écran de gestion. Cette fois, je voudrais utiliser cette Permission pour limiter la vue.

Créez votre propre Permission

Créons-en un nouveau sans utiliser les données existantes Permission.

Spécification de ContentType

Le modèle Permission vous oblige à spécifier ContentType comme clé externe, il doit donc y avoir un ContentType correspondant. Je pense que vous pouvez spécifier le ContentType de l'application avec la vue que vous essayez de limiter, mais vous pouvez créer la vôtre.

from django.contrib.contenttypes.models import ContentType


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

Le nom de l'application est spécifié sous la forme ʻapp_label. En d'autres termes, c'est la fin du nom du module spécifié dans des paramètres tels que ʻINSTALLED_APPS.

Création de données «Permission»

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 est un nom d'affichage pour les permissions telles que'Peut ajouter une permission', et codename est un nom distinctif tel que'add_permission'.

Accorder "Permission" à l'utilisateur

Vous pouvez accorder des autorisations depuis l'écran d'édition utilisateur de l'écran de gestion Django.

perm.png

Découvrez si un utilisateur a une "permission" particulière

Vous pouvez vérifier si vous avez une Permission spécifique en appelant has_perm de l'instance ʻUser`. Passez-le en argument sous la forme app_label.codename ''. Par exemple, l'autorisation d'ajouter un utilisateur est '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'))

Limiter la vue avec le décorateur

(Notes complémentaires)

À titre de référence, dans Django, si vous souhaitez créer une vue que seuls les utilisateurs du personnel peuvent voir, il existe un moyen d'utiliser un décorateur.

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)

En imitant cela, nous créerons une vue qui ne peut être consultée que par des utilisateurs disposant d'autorisations spécifiques.

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)

(Une addition)

Il y avait un permission_required dans Django sans aucune astuce. https://docs.djangoproject.com/ja/1.10/topics/auth/default/#the-permission-required-decorator

Limiter les modèles avec des balises personnalisées

Les détails de la création d'une balise personnalisée dépassent le cadre de cet article, je vais donc l'omettre, mais je pense qu'il est possible de limiter le modèle à l'aide d'une balise personnalisée, je vais donc donner un exemple.

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">Pour modifier la page</a>
{% else %}
  <del>Aller à la page d'édition</del>(Pas autorisé)
{% endif %}

Recommended Posts

Limiter les vues à l'aide du modèle d'autorisation de Django
Avantages de l'utilisation de slugfield dans le modèle Django
La forme modèle de Django était incroyable.
Avantages d'affiner le modèle de Django
Essayez d'utiliser la fonction de modèle de Django