Python Django层次结构权限

Python Django层次结构权限,python,django,django-permissions,Python,Django,Django Permissions,我希望在Django应用程序中具有分层权限 例如:-考虑有4个层次-< /P> Admin Sub-admin(CountryLevel(CL) Admin) sub-sub-admin(StateLevel(SL) Admin) And then normal Users(U). 管理员将创建CL,作为回报,CL将创建SL,SL最终将装载用户。最终目标是为用户提供支持 管理员有权对任何用户应用CRUD操作。CL应有权访问由CL创建的SLs加载(创建)的用户(对象)。作为回报,SL应该只能访问

我希望在Django应用程序中具有分层权限

例如:-考虑有4个层次-< /P>
Admin
Sub-admin(CountryLevel(CL) Admin)
sub-sub-admin(StateLevel(SL) Admin)
And then normal Users(U).
管理员将创建CL,作为回报,CL将创建SL,SL最终将装载用户。最终目标是为用户提供支持

管理员有权对任何用户应用CRUD操作。CL应有权访问由CL创建的SLs加载(创建)的用户(对象)。作为回报,SL应该只能访问由他创建的那些用户(对象)此外,用户可以直接注册自己,无需任何管理员参与。在这种情况下,用户应能够访问自己的应用程序。

我如何获得这样的树级权限

我能想到的解决方案是(但不确定):-

我已经更新了
auth_group
表,并在其中添加了
parent_id
。下面是模式

id, group_name, parent_id
parent\u id
的意义在于创建组的树状结构。创建的组数等于树的高度。对于EG考虑以下结构:-

id, group_name, parent_id

1 , admin, 0
2, CL, 1
3, SL, 2
现在,当创建任何用户(已登录)时,我将分配一个
SL group\u id
,它将添加到
auth\u user\u groups
表中

现在,我想问以下问题

1) 我如何管理组的层次级权限,即SL应只能访问由他创建的SLs上的用户,CL应能够访问由他创建的SLs上的所有用户,等等

2) (不确定我的想法是否正确)现在,由于我已将一个组SL分配给SL所搭载的所有用户,该用户是否能够作为同一组的一部分访问彼此的信息


3) 对于直接登录(即不通过任何SL)的用户,我不会将他们映射到任何组。对吗?

Django已经允许一组用户权限,我们可以根据需要自定义这些权限

  • 创建所需的组(例如,从管理面板中,或通过以下方式创建):

  • '国家管理组`
  • “州管理组”
  • “用户组”
  • 为用户组创建自定义权限并相应地添加它们:

    from django.contrib.auth.models import Group
    from django.contrib.contenttypes.models import ContentType
    from your_app_name.models import CustomUserModel
    
    ct = ContentType.objects.get_for_model(CustomUserModel)
    permission_sl = Permission.objects.create(
        codename='can_add_sl_user',
        name='Can add SL user',
        content_type=ct
    )
    permission_user = Permission.objects.create(
        codename='can_add_simple_user',
        name='Can add simple user',
        content_type=ct
    )
    ...
    cl_group = Groups.get(name='country-admin-group')
    cl_group.permissions.add(permission_sl)
    cl_group,permissions.add(permission_user)
    
    sl_group = Groups.get(name='state-admin-group')
    sl_group,permissions.add(permission_user)
    ...
    
  • 为每种类型的用户创建视图(以及相应的URL)。
    我个人更喜欢在适用时使用基于类的视图。我们将使用和装饰器控制对每个视图的访问:

    from django.http import HttpResponse
    from django.views import View
    
    class CountryAdminView(View):
    
        @login_required
        def list(self, request):
            """
            Can access only users created by him
            """
            content = Users.objects.filter(parent_id=request.user.id)
            return HttpResponse(content)
    
        @method_decorator(@permission_required('your_app_name.can_add_sl_user'))
        def create(self, request):
           ...
           Logic for creating an SL admin user.
    
        ...
    
请记住,以上是一个简化的示例,可以帮助您找到解决方案


正如@BurhanKhalid所指出的,您可以通过使用跳过上面的一部分


您还可以使用来定义每个用户角色并为这些角色添加权限。

一个小示例将非常有用。如果您单击我评论中的链接,您将找到一个示例项目。@BurhanKhalid-如果我需要将专用的OAuth2服务器作为服务,OAuth2服务器将如何管理权限?嗯,我了解并理解如何分配对象级权限。请回答一个简短的问题。如何创建组的层次结构?当将对象权限分配给最低级别的组时,如何为父组分配访问同一对象的权限。或者我应该手动将其分配给每个父组?缺少的主要内容是用户的层次结构?Level0用户将如何查看由下级创建的所有用户?“我如何创建组的层次结构?在将对象权限分配给最低级别的组时,将如何为父组分配访问同一对象的权限。或者我应该手动为每个父组分配权限?”@pythonenthus最后一条评论:在视图中,
返回MyCustomUsers.objects.all()
。。。对于第二条注释,将手动创建层次结构(参见答案)。对于自“入职”用户,您可以定义一个组a
自接纳用户
组,每个级别的管理员也可以是该组的成员…好的。我想我没有把自己说清楚。在第一个评论中,考虑3个层次(0, 1, 2)。L0管理员正在创建Level1用户。现在L1管理员正在创建L2用户。现在,由于L2用户(对象)是由L1创建的,所以我将L2的对象级权限分配给L1<代码>L0现在将如何查看L2的详细信息?@pythonenthus最后,如果L0用户是超级用户,他可以访问所有类型的用户。不同的是,为L0用户组授予您创建的每个权限。类似地,授予L1用户组查看和创建L2和L3用户等的权限。