【问题标题】:Django group permissions for whole app整个应用程序的 Django 组权限
【发布时间】:2014-01-29 03:29:14
【问题描述】:

我能否以编程方式为组授予整个应用程序的所有权限?
当然,我可以为该组授予应用程序中每个特定模型的所有添加、更改、删​​除权限。但后来,如果我需要添加另一个模型,我需要更改代码,我也在其中授予权限。
因此,我需要找到一种可能性,在不知道其名称的情况下,授予应用程序内的所有模型的所有权限。
Django 文档对此没有帮助。

编辑
为您提供更多详细信息:我将 RemoteUserBackend 子类化并覆盖 configure_user 方法以将新用户添加到特定组。如果没有创建这个组,我会创建它并希望给它必要的权限:

class MyRemoteUserBackend(RemoteUserBackend):

    def configure_user(self, user):
        group, created = Group.objects.get_or_create(name="mygroup")
        if created:
            pass
            # Give permissions here

        user.groups.add(group)

        group.save()

【问题讨论】:

  • 我认为没有办法使用默认权限系统
  • 我唯一想到的就是编写一个中间件来检查请求路径是否与应用程序匹配,然后检查用户权限。然而,这是一种相当模糊的方式。
  • 也许有办法获取模块的所有类名?然后我可以做一些像for classname in module: classname.addpermission...
  • 您可以为管理员创建子视图...虽然这有点复杂而且可能有点矫枉过正..
  • 您可以编写管理命令,将组的权限与某些应用程序同步。

标签: python django permissions


【解决方案1】:

这是将应用模型权限与组同步的管理命令的速写:

# coding=utf-8

from django.core.management.base import BaseCommand, CommandError
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission, Group

class Command(BaseCommand):
    args = '<group_name app_label>'
    help = ('Syncs permissions of group with given name with permissions 
             of all models of app with giver app_label ')

    def handle(self, *args, **options):
        group_name= args[0]
        app_label = args[1]

        group = Group.objects.get(name=group_name)
        cts = ContentType.objects.filter(app_label=app_label)
        perms = Permission.objects.filter(content_type__in=cts)
        group.permissions.add(*perms)

【讨论】:

  • 难道我这里还有获取模块中所有模型的问题吗?
  • 没有看到任何问题 - app_label 识别某个应用程序,该应用程序的所有模型在 DB 中都有对应的 ContentType 对象,因此获得这些内容类型的所有权限意味着获得所有这些内容类型的所有权限应用的模型。
  • 啊,好吧。我还没有听说过 ContentType...我会读一读
【解决方案2】:

您可以将组的用户设置为超级用户,然后在检查权限时,请执行以下操作:

if user.is_superuser:
    #allow
else:
    #check permissions

【讨论】:

  • 不...我真的不想让我的用户成为超级用户。如果我这样做了,我将不再需要权限系统
猜你喜欢
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2011-11-15
  • 2016-09-15
相关资源
最近更新 更多