Wagtail admin - игра с URL - PullRequest
       7

Wagtail admin - игра с URL

0 голосов
/ 02 декабря 2018

Я создал в трясогузке модель с именем Regbox в model.py, а также RegboxModelAdmin в wagtail_hooks.py.Администратор трясогузки включает пункт Regbox в меню боковой панели трясогузки.Затем я программно создал новую коллекцию, новую группу с разрешениями на добавление, редактирование, удаление Regbox, и эта группа назначается новому пользователю после регистрации.Новый пользователь может добавить (отредактировать и удалить) новый Regbox (модель Regbox имеет forein-ключ User), и этот новый пользователь может видеть в администраторе трясогузки только свои собственные регистры (я использовал фильтр наборов запросов, чтобы суперпользователь мог видеть все регистры в администраторе трясогузки и текущемпользователь только свои собственные ящики).Но если этот новый пользователь играет с URL в своем браузере, он может видеть и другие регистры (не только свои собственные).Просто он может изменить URL-адрес, например, с / regbox / edit / 5 / на / regbox / edit / 8 /, и он может видеть эту страницу, хотя эта страница / regbox принадлежит другому пользователю (здесь потребуется разрешение запрещено).Может ли кто-нибудь посоветовать мне, как я могу сделать это в администраторе трясогузки, чтобы любой пользователь мог видеть только свои собственные страницы regbox?Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Разрешения в Django (и Wagtail по расширению) обрабатываются для каждой модели, а не для каждого экземпляра.Следовательно, предоставление пользователю прав на Regbox для редактирования позволит ему / ей редактировать все экземпляры этой модели.В Wagtail есть несколько исключений (например, модель Page).

В любом случае, вы сможете достичь желаемого и добавить настраиваемую проверку разрешений, прикрепив пользовательский класс помощника разрешений кВы ModelAdmin определение.

from wagtail.contrib.modeladmin.helpers import PermissionHelper
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from .models import Regbox


class RegboxPermissionHelper(PermissionHelper):
    def user_is_owner(self, user, obj):
        if user.pk == obj.owner:
            return True
        else:
            return False

    def user_can_inspect_obj(self, user, obj):
        """
        Return a boolean to indicate whether `user` is permitted to 'inspect'
        a specific `self.model` instance.
        """
        return self.user_is_owner(user, obj) && super().user_can_inspect_obj(user, obj)

    def user_can_edit_obj(self, user, obj):
        """
        Return a boolean to indicate whether `user` is permitted to 'change'
        a specific `self.model` instance.
        """
        return self.user_is_owner(user, obj) && super().user_can_edit_obj(user, obj)

    def user_can_delete_obj(self, user, obj):
        """
        Return a boolean to indicate whether `user` is permitted to 'delete'
        a specific `self.model` instance.
        """
        return self.user_is_owner(user, obj) && super().user_can_delete_obj(user, obj)


class RegboxModelAdmin(ModelAdmin):
    model = Regbox
    permission_helper_class = RegboxPermissionHelper

modeladmin_register(RegboxModelAdmin)

Как видите, мы создаем новый вспомогательный класс RegboxPermissionHelper и определяем методы для разрешений inspect, edit и delete, которые сначала проверяют, чтопользователь является владельцем (это было извлечено из его собственного метода), а затем вызывает super, чтобы позволить исходной проверке разрешений произойти.Вызов super важен, поэтому он возвращает false, если пользователь не является владельцем, но он также возвращает false, если пользователь является владельцем, но не имеет определенного разрешения (например, вы можете создавать и редактировать, но не удалять).

FWIW, я думаю, вы используете правильный механизм для фильтрации представления списка путем фильтрации queryset , поэтому ничего не меняйте там.

...