Django 查询集权限

2024-05-01

我正在构建一个相当复杂的Django在电子邮件扫描服务之上使用的应用程序。这Django应用程序是使用 Python 3.5+ 编写的

该应用程序主要使用Django Rest Framework处理与浏览器前端的通信。

我目前遇到的问题是我尝试实施System Administrator, Domain Administrator and Application User

The System Administrator基本上是“正常”的djangosuperuser因此能够执行所有操作并查看系统中的每条记录。

The Domain Administrator是管理一个或多个的用户email domains。我用一个来跟踪这个Many2Many之间的关系usersdomains。然后,我们的想法是预定义一个过滤器,以便处理的消息日志将被自动过滤,仅显示sender domain or the recipient domain等于adomain在列表中domains即给定的user被分配给.

对于blacklisting/whitelisting政策。

If the Domain Administrator没有分配给任何domains,则不显示任何数据。

The Application User基本上是任何经过身份验证的用户,具有一个或多个domains分配给他们,使用相同的Many2Many关系为Domain Administrator。如果未分配域,则不会显示任何数据。

我在 Stackoverflow 上找到了一些其他解决方案request.user可供QuerySet in the ModelManager,但这似乎不是处理它的正确方法。

我看过django-guardian, django-authority and django-permissions,但它们似乎都没有影响QuerySet或结果对象列表。

有没有人对可用于处理此问题的 Django 包/插件有建议,或者可能有关于如何处理此问题的想法?


我是作者django-cancan图书馆https://github.com/pgorecki/django-cancan https://github.com/pgorecki/django-cancan它致力于解决您所描述的确切问题。

其原理如下:首先,确定每个用户的能力,然后在视图中,您可以检查给定对象、模型的用户能力,或者可以根据这些能力检索查询集。

声明部分如下所示:

def declare_abilities(user, ability):
    if not user.is_authenticated:
        # Allow anonymous users to view only published articles
        ability.can('view', Article, published=True)
    else:
        # logged in user can view any article...
        ability.can('view', Article)
        # ... and change his own
        ability.can('change', Article, author=user)
        # ... and add new ones
        ability.can('add', Article)

    if user.is_superuser:
        # Allow superuser to view and change any article
        ability.can('view', Article)
        ability.can('change', Article)

然后您可以检查每个对象级别的能力:

def article_detail_view(request, pk):
    article = Article.objects.get(pk=pk)
    if request.ability.can('view', article):
        ...

或在模型级别:

def article_create_view(request, pk):
    if request.ability.can('add', Article):
        ...

或获取具有可访问对象的查询集:

def another_list_view(request, pk):
    articles = request.ability.queryset_for('view', Article)
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 查询集权限 的相关文章

随机推荐