【问题标题】:Wagtail: How to verify if a user can access a page in the templateWagtail:如何验证用户是否可以访问模板中的页面
【发布时间】:2020-03-20 04:08:57
【问题描述】:

我正在使用 Django with Wagtail 创建一个个人网站,属于不同组的用户可以访问某些页面。例如,家人组可以看到我的假期照片,而同事组可以看到一些内部文件。

通过管理员设置权限访问权限非常简单。但是,我想在 forbidden 页面的链接旁边显示一个锁。这将使用户非常清楚哪些链接可以访问,哪些链接不能。

有没有办法验证当前用户是否可以访问给定的页面?

【问题讨论】:

    标签: django templates permissions wagtail


    【解决方案1】:

    在摆弄了 Wagtail 的代码之后,我发现权限是通过一个名为 PageViewRestriction 的模型处理的(code 非常简洁明了),它又继承了 BaseViewRestriction 定义了一个方法 @ 987654324@。由于所引用的页面存储在模型中,因此唯一缺少的部分是请求访问的用户。

    有了这个,我已经设法组合了一个非常简单的模板标签,它检查当前用户是否可以看到给定的页面。过滤器如下所示:

    @register.simple_tag(takes_context=True)
    def can_view(context, page):
        pvrs = PageViewRestriction.objects.filter(page=page)
        request = context['request']
        if pvrs:
            for pvr in pvrs:
                if pvr.accept_request(request):
                    return True
            return False
        return True
    

    我又在我的模板中使用这样的:

    {% can_view menuitem as permission %}
      {% if not permission %}
        <i class="fas fa-lock"></i>
      {% endif %}
    

    请注意,原则上一个页面可以指定多个不同的权限。例如,不同组的成员可以查看它。我假设如果当前用户属于这些组之一,或者该页面未指定查看权限,则该用户可以访问该页面。

    【讨论】:

    • 很好的调查 - 但请注意,这可能会产生 lot 的查询。您可能需要考虑某种策略来对用户会话中允许的内容进行分组,以避免为页面上的每个链接添加查询。
    • 我知道这有点暴力。我只是想快速概述一下信息的实际存储位置(我花了一些时间来挖掘 Wagtail 的代码)。我没有足够的时间考虑更灵活的方法。当然,可以随时检查用户所属的组,但访问页面的逻辑可能更复杂......
    • 最好使用pvrs = page.get_view_restrictions()。这也将获得同样适用的祖先页面的查看限制。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多