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),我不会将他们映射到任何组。正确的?
Django 已经允许组、用户权限,我们可以根据需要进行自定义。
创建您需要的组(例如,形成管理面板,或按照此 SO 帖子。):
为您的用户组创建自定义权限并相应地添加它们:
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定义每个用户角色并向这些角色添加权限。