Проблемы, ограничивающие редакторов собственным контентом в Wagtail admin - PullRequest
0 голосов
/ 20 мая 2019

Пользователи, которые были назначены группе с правами «добавления», могут получать доступ, копировать, перемещать и добавлять страницы, созданные другими пользователями, с помощью поиска администратора или путем прямого ввода правильного пути в браузере.

Цель состоит в том, чтобы пользователи не видели ничего, что делают другие пользователи. Я думал, что это в значительной степени осуществлено.

Дерево моей страницы выглядит так:

Главная> Персоны> Персона> Персональная история

Пользователи регистрируются в учетной записи и автоматически назначаются в пользовательскую группу «Авторы». Эта группа имеет разрешения на добавление и публикацию на странице «Персоны». Пользователь несет ответственность за любое количество людей в своей команде. С помощью этой настройки они могут добавить страницу профиля для каждого члена своей команды. Затем можно добавить несколько историй для каждого человека с профилем. Теперь у каждого человека есть подстраницы историй, связанные с их профилем.

У меня настроен проводник страниц, поэтому пользователи видят только свои страницы:

@hooks.register('construct_explorer_page_queryset')
def show_authors_only_their_articles(parent_page, pages, request):
    user_group = request.user.groups.filter(name='Authors').exists()
    if user_group:
        pages = pages.filter(owner=request.user)

    return pages

Средство выбора изображений также отображает только изображения, загруженные пользователем:

@hooks.register('construct_image_chooser_queryset')
def filter_images_by_user(images, request):
    images = images.filter(uploaded_by_user=request.user)

    return images

И элементы сводной страницы показывают только то, что принадлежит пользователю, использующему подобный код.

Но во время финального тестирования я обнаружил, что поиск, выполненный с помощью административного поиска, приводит к списку всех доступных страниц «Персональный профиль» и «Персональная история» с этими поисковыми терминами. Например, если они ищут «Джона», все страницы «Профиль» и «История» возвращаются для Джона. Пользователи могут затем нажать на странице профиля Джона. Зайдя на страницу профиля Джона в проводнике, они могут добавлять истории в профиль Джона, копировать, перемещать или отменять их публикацию! Они могут сделать то же самое с историями Джона, за исключением добавления подстраницы.

Это изменит правила игры и не будет работать для нас.

Я посмотрел вокруг и увидел, что может быть несколько решений:

1) Создайте аналогичную настройку с помощью ModelAdmin, но я думаю, что у меня возникнет та же проблема. При поиске пользователи по-прежнему смогут находить и манипулировать запрещенным контентом.

2) Создайте уникальную группу пользователей для каждого пользователя, как рекомендуется в этом посте: Трясогузка на страницу разрешения пользователя

Во втором методе после создания пользователя мне потребуется программно:

1) Создайте новую группу пользователей только для них, возможно, используя их имя пользователя.

2) Назначить их новой группе пользователей

3) Создайте новую страницу «Персона», специфичную для них, и предоставьте им разрешения «добавлять» и «публиковать».

Последний шаг, потому что, кажется, что если я назначу их всем одной и той же персоне, они все равно смогут добавлять страницы в профили других пользователей, независимо от того, находятся ли они в другой группе пользователей, поскольку все эти разные группы пользователей по-прежнему будут добавить доступ к той же странице персонажа.

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

Я думаю, что мы довольно близки. Система работает и работает так хорошо!

1 Ответ

0 голосов
/ 23 мая 2019

Я наконец выяснил это путем поиска экземпляров GroupPagePermission и GroupCollectionPermission в основном пакете Wagtail. Был в состоянии собрать это вместе, глядя на то, как они это сделали.

В файле models.py приложения, которое я назвал «пользователи», я реализовал django-allauth user_sign_up @receiver. Как только пользователь успешно зарегистрировался, он запускает следующий код:

from django.contrib.auth.models import Group, Permission
from django.dispatch import receiver
from allauth.account.signals import user_signed_up
from wagtail.core.models import Page, GroupPagePermission, GroupCollectionPermission, Collection
from article.models import PersonIndexPage

@receiver(user_signed_up)
def create_user_group_and_pages(sender, **kwargs):
    """
    When a new user signs up create a unique group and page for them.
    Assign it the appropriate permission for admin, page and collection access.
    """

    # Grab the new user
    user = kwargs['user']

    # Create a group object that matches their username
    new_group, created = Group.objects.get_or_create(name=user.username)

    # Add the new group to the database
    user.groups.add(new_group)

    # Create new permission to access the wagtail admin
    access_admin = Permission.objects.get(codename='access_admin')

    # Add the permission to the group
    new_group.permissions.add(access_admin)

    # Now start creating page access
    # First find the homepage
    home = Page.objects.get(slug='home').specific

    # Create unique PersonIndexPage for the user
    person_index_page = PersonIndexPage(title=user.username)

    # Add PersonIndexPage to homepage as a child
    home.add_child(instance=person_index_page)

    # Save new page as first revision
    person_index_page.save_revision()

    # Create new add GroupPagePermission
    GroupPagePermission.objects.create(
        group=new_group,
        page=person_index_page,
        permission_type='add'
    )

    # Create new GroupCollectionPermission for Profile Images collection
    GroupCollectionPermission.objects.create(
        group=new_group,
        collection=Collection.objects.get(name='Images'),
        permission=Permission.objects.get(codename='add_image')
    )

Теперь, когда a создает новую учетную запись, для них создается новая страница индекса, для которой создана уникальная группа, которая дает им доступ только к этой странице индекса и ее дочерним страницам. Эффективно блокирует им доступ к любому другому контенту на сайте. Они по-прежнему могут видеть результаты на других страницах в поиске администратора, но не имеют права что-либо делать с этими результатами.

Пользователи могут войти в систему, создать профили для каждого человека и затем столько историй, сколько они хотят для каждого человека.

...