Django层次权限

4

我希望在我的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

现在,当创建(onboarded)任何用户时,我将指定一个SL group_id,该ID将添加到auth_user_groups表中。
现在,我想问以下问题:
1)如何管理组的层次级别权限?例如,SL只能访问由他创建的用户,在他下面创建的SL创建的用户CL可以访问所有用户。
2)(不确定我是否考虑正确)现在,因为我已将组SL分配给所有由SL onboarded的用户,这些用户是否能够访问彼此的信息?
3)对于直接登陆的用户(即未通过任何SL),我不需要映射到任何组。对吗?

2
django-guardian - Burhan Khalid
一个小例子会非常有帮助。 - Praful Bagai
2
如果您点击我的评论中的链接,您将会找到一个示例项目。 - Burhan Khalid
如果我需要制作一个专用的OAuth2服务器作为服务,那么OAuth2服务器应该如何管理权限? - Praful Bagai
我明白如何分配对象级别的权限。请问一个快速问题:如何创建一组层次结构?并且在将对象权限分配给最低级别的组时,父级组将如何被分配访问相同对象的权限。或者我应该在每个父组上手动分配它? - Praful Bagai
@BurhanKhalid - 任何关于此事的线索都将非常有帮助。谢谢! - Praful Bagai
1个回答

0

Django已经允许我们自定义组、用户权限以满足我们的需求。

  • 创建所需的组(例如通过管理员面板或按照this SO post中的说明操作):

    1. 'country-admin-group'
    2. 'state-admin-group'
    3. 'user-group'
  • 为用户组创建自定义权限并相应地添加它们:

    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):
            """
            只能访问由他创建的用户
            """
            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):
           ...
           用于创建SL管理员用户的逻辑。
    
        ...
    
请记住,以上是一个简化的示例,旨在引导您走向解决方案的道路。

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

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


唯一缺少的是用户的层次结构。Level0用户如何查看下级层级创建的所有用户? - Praful Bagai
我该如何创建一组层次结构?当将对象权限分配给最低级别的组时,父级组将如何被分配访问同一对象的权限。或者我应该在每个父级组上手动分配它吗? - Praful Bagai
@PythonEnthusiast 针对您的第一条评论:在视图中,return MyCustomUsers.objects.all()...对于第二条评论,层次结构将手动创建(请参见答案)。对于“自我入职”的用户,您可以定义一个名为self-admitted-users的组,并且每个管理员级别也可以成为该组的成员... - John Moutafis
好的,我想我没有表达清楚。在第一条评论中,考虑三个级别(0、1、2)。L0管理员正在创建Level1用户。现在L1管理员正在创建L2用户。现在,由于L2用户(对象)是由L1创建的,所以我将L2的对象级别权限分配给了L1。L0现在如何查看L2的详细信息? - Praful Bagai
可以有多个L0用户。每个L0组的用户都可以创建自己的L1用户,随后,每个L1用户都可以创建自己的L2用户。现在,L0用户需要查看由L0拥有的L1用户创建的所有L2用户。因此形成了一个层次结构。我该如何创建这样的分层权限? - Praful Bagai
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接