我希望在我的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),我不会将它们映射到任何组。正确?
答案 0 :(得分:0)
Django已经允许我们可以根据我们的需求定制Group,User权限。
创建您需要的群组(例如,从管理面板或this SO post开始)。
为您的用户组创建自定义权限并相应地添加它们:
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_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.
...
请注意,上面是一个简化的示例,可以让您进入解决方案的路径。
正如@BurhanKhalid指出的那样,您可以使用django-guardian跳过上述部分内容。
您还可以使用django-role-permissions定义每个用户角色并为这些角色添加权限。