Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 整个应用程序的Django组权限_Python_Django_Permissions - Fatal编程技术网

Python 整个应用程序的Django组权限

Python 整个应用程序的Django组权限,python,django,permissions,Python,Django,Permissions,我可以通过编程方式为组授予整个应用程序的所有权限吗? 当然,我可以为该组授予应用程序中每个特定模型的所有添加、更改和删除权限。但是以后,如果我需要添加另一个模型,我需要更改代码,并在其中授予权限。 因此,我需要找到一种可能,在不知道应用程序中所有模型的名称的情况下,授予所有模型的所有权限。 Django文档对我没有帮助 编辑 为了给您提供更多的细节:我对RemoteUserBackend进行了子cassed,并重写了configure_user方法,以便向特定组添加新用户。如果未创建此组,我将创

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

编辑
为了给您提供更多的细节:我对RemoteUserBackend进行了子cassed,并重写了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()

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

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

这是将应用程序模型权限与组同步的管理命令的快速草图:

# 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)
#编码=utf-8
从django.core.management.base导入BaseCommand,CommandError
从django.contrib.contenttypes.models导入ContentType
从django.contrib.auth.models导入权限,组
类命令(BaseCommand):
args=''
help=(“将具有给定名称的组的权限与权限同步”
具有giver app_标签的所有型号的应用程序)
def句柄(自身、*参数、**选项):
组名称=args[0]
app_label=args[1]
group=group.objects.get(name=group\u name)
cts=ContentType.objects.filter(app\u label=app\u label)
perms=Permission.objects.filter(content\u type\u in=cts)
group.permissions.add(*perms)

我认为没有办法使用默认权限系统。我想到的唯一一件事是编写一个中间件,检查请求路径是否与应用程序匹配,然后检查用户权限。然而,这是一种相当模糊的方法。也许有一种方法可以获得一个模块的所有类名?然后我可以在模块中为classname做一些类似
的事情:classname.addpermission…
您可以为管理员创建子视图。。。虽然这有点复杂,可能有点过头了。你可以编写管理命令,将组的权限与某些应用程序同步。不……我真的不想让我的用户成为超级用户。如果我这样做了,我就不再需要权限系统了。在这里,获取模块中的所有模型不是仍然存在问题吗?看不到任何问题-
app\u标签
识别某些应用程序,此应用程序的所有模型在DB中都有相应的
ContentType
对象,所以获取这些内容类型的所有权限意味着获取应用程序所有模型的所有权限。啊,好的。我还没有听说过ContentType…我会读到的