Django层次结构权限

时间:2018-03-15 13:03:43

标签: python django django-permissions

我希望在我的Django应用程序中拥有层级权限。

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

Admin
Sub-admin(CountryLevel(CL) Admin)
sub-sub-admin(StateLevel(SL) Admin)
And then normal Users(U).

管理员将创建CL,作为回报,CL将创建SL,而SL将最终登录用户。最终目标是为用户提供支持。

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

如何实现类似树级的权限?

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

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

id, group_name, parent_id

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

id, group_name, parent_id

1 , admin, 0
2, CL, 1
3, SL, 2

现在,当创建任何用户(已登机)时,我将分配一个SL group_id,该auth_user_groups将添加到(click)=self[action.link]() 表中。

现在,我想提出以下问题

1)如何管理组的层次结构级别权限,即SL应该只能访问他登录的用户,CL应该能够访问由他创建的SL等所有用户登录的用户。

2)(不确定我是否正确思考)现在,由于我已经为SL所有用户分配了一个组SL,用户是否能够访问彼此的信息,成为其中的一部分同组?

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

1 个答案:

答案 0 :(得分:0)

Django已经允许我们可以根据我们的需求定制Group,User权限。

  • 创建您需要的群组(例如,从管理面板或this SO post开始)。

    1. '国家管理员-group`
    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)
    ...
    
  • 为每种类型的用户创建视图(和相应的URL)。
    就个人而言,我更喜欢在适用时使用基于类的视图。我们将使用method_decoratorpermission_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.
    
        ...
    

请注意,上面是一个简化的示例,可以让您进入解决方案的路径。

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

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