Django 层次结构权限

Pyt*_*ast 5 python django django-permissions

我想在我的 Django 应用程序中拥有层次级别权限。

例如:- 考虑有 4 个级别 -

Admin
Sub-admin(CountryLevel(CL) Admin)
sub-sub-admin(StateLevel(SL) Admin)
And then normal Users(U).
Run Code Online (Sandbox Code Playgroud)

管理员将创建 CL,作为回报,CL 将创建 SL,而 SL 最终将吸引用户。最终目标是吸引用户。

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

我怎样才能获得像树级别的权限?

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

我已经更新了auth_group表格并添加parent_id到其中。以下是架构。

id, group_name, parent_id
Run Code Online (Sandbox Code Playgroud)

的意义parent_id在于创建一个树状的组结构。创建的组数等于树的高度。例如,考虑以下结构:-

id, group_name, parent_id

1 , admin, 0
2, CL, 1
3, SL, 2
Run Code Online (Sandbox Code Playgroud)

现在,当创建任何用户(加入)时,我将分配一个SL group_id,它将添加到auth_user_groups表中。

现在,我想问以下问题

1)如何管理组的层次权限,即SL应该只能访问他所加入的用户,CL应该能够访问他创建的SL所加入的所有用户等等。

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

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

Joh*_*fis 0

Django 已经允许组、用户权限,我们可以根据需要进行自定义。

  • 创建您需要的组(例如,形成管理面板,或按照此 SO 帖子。):

    1. '国家管理组'
    2. '状态管理组'
    3. '用户组'
  • 为您的用户组创建自定义权限并相应地添加它们:

    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)
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 为每种类型的用户创建视图(以及相应的 URL)。
    就我个人而言,我更喜欢在适用时使用基于类的视图。method_decorator我们将使用和装饰器控制对每个视图的访问permission_required:

    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.
    
        ...
    
    Run Code Online (Sandbox Code Playgroud)

请记住,上面是一个简化的示例,可帮助您找到解决方案。


正如 @BurhanKhalid 指出的,您可以使用django-guardian跳过上述部分内容。

您还可以使用django-role-permissions定义每个用户角色并向这些角色添加权限。