在Wagtail管理员中限制编辑者只能使用自己的内容的问题

时间:2019-05-20 15:06:15

标签: python wagtail

已被分配到具有“添加”权限的组的用户可以通过管理员搜索或在浏览器中直接输入正确的路径来访问,复制,移动和添加其他用户创建的页面。

目标是防止用户看到其他用户在做什么。我以为它已经实现了。

我的页面树看起来像这样:

主页>人物>人物个人资料>人物故事

用户注册一个帐户,并自动分配给自定义的“作者”组。该组在“人员”页面上具有“添加”和“发布”权限。用户对团队中的任何数量的人员负责。通过此设置,他们可以为团队中的每个成员添加一个“个人资料”页面。然后,可以为每个有简介的人添加多个故事。现在,每个人都有与其个人资料相关联的故事子页面。

我设置了页面浏览器,因此用户只能看到他们的页面:

@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

页面摘要项使用相似的代码仅显示属于用户的内容。

但是在我认为将要进行最终测试的过程中,我发现使用管理员搜索完成的搜索会导致列出所有包含这些搜索词的“个人资料”和“个人故事”页面。例如,如果他们搜索“ John”,则返回John的所有“个人资料”和“故事”页面。然后,用户可以单击John的个人资料页面。到达浏览器中John的个人资料页面后,他们便可以将Stories添加到John的个人资料中,进行复制,移动或取消发布!他们可以对John的故事做同样的事情,而无需添加子页面。

这是游戏规则改变者,对我们不起作用。

我环顾四周,看看可能有几种解决方案:

1)使用ModelAdmin创建类似的设置,但是我想我会遇到同样的问题。搜索时,用户仍然可以找到和处理禁止的内容。

2)按照本文中的建议为每个用户创建一个唯一的用户组:Wagtail per page user permission

在第二种方法中,创建用户后,我需要以编程方式:

1)可能仅使用他们的用户名为他们创建一个新的用户组。

2)将他们分配给新的用户组

3)创建一个特定于他们的新“人员”页面,并为其授予“添加”和“发布”权限。

最后一步,因为似乎如果我将它们全部分配到同一个“个人”页面,则无论它们位于不同的用户组中,他们仍然仍可以将页面添加到其他用户“个人档案”,因为所有这些不同的用户组仍然可以访问同一个人页面。

最终,我需要阻止每个用户与其他用户在做什么。非常感谢您的想法。自从我完成任何编程工作已经有好几年了,但我仍在追赶。同时,我将开始看到我可以提出的想法。

我认为我们非常接近。该系统运行良好,流程流畅!

1 个答案:

答案 0 :(得分:0)

我终于通过在Wagtail核心包中搜索GroupPagePermission和GroupCollectionPermission的实例来弄清楚这一点。能够将它们拼凑在一起,看看他们是如何做到的。

在一个应用程序的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')
    )

现在,当创建一个新帐户时,会为他们创建一个新的索引页面,该页面具有唯一的组,该组使他们只能访问该索引页面及其子页面。有效地阻止他们访问网站上的任何其他内容。他们仍然可以在管理员搜索中的其他页面上看到结果,但无权对这些结果做任何事情。

用户可以登录,为每个人创建个人资料,然后为每个人创建任意数量的故事。