gpt4 book ai didi

python - 在Django上实现多层角色

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:42 24 4
gpt4 key购买 nike

与 django 组合作并获得许可。正常情况下工作正常。现在想要添加只能授予特定模型权限的子管理员。如何实现?

最佳答案

根据我们的讨论,下面是我的步骤:

  1. 覆盖公司角色,或者您可以将其保留在 super 管理员级别。 http://127.0.0.1:8000/admin/auth/role/

  2. 添加单独的权限表,其中包含 pk、客户端 ID、RoleID、添加、编辑、查看、删除、模型、操作 (URL) 列

  3. 为每个操作或模型添加装饰器,并检查该特定操作或模型的权限。

  4. 使用常见功能(如 check_role_permissions_admin

    )检查管理员中的角色和权限

//在单独/公共(public)函数文件中添加以下函数。

def check_role_permissions_admin(request, url=None):
if not hasattr(request.user,"client"):
return {
'clientwise': False,
'add': False,
'change': False,
'delete': False,
'view': False,
'icon': ''
}
super_admin_role = Role.objects.get(pk=1)
all_roles = request.user.groups.all()
try:
action = Actions.objects.get(
url=url
)
except:
action = None
if super_admin_role in all_roles:
return {
'clientwise': False,
'add': True,
'change': True,
'delete': True,
'view': True,
'icon': str(action.icon) if action else ''
}

// Write Logic here for Role and Permissions of requested action(s)
roles = [group for group in request.user.groups.all()]
permissions = ActionPermissions.objects.filter(
client=request.user.client,
role__in=roles,
action__url=url
)
if permissions.exists():
permobj = permissions[0]
return {
'clientwise': True if permobj.client else False,
'add': True if permobj.add else False,
'change': True if permobj.change else False,
'delete': True if permobj.delete else False,
'view': True if permobj.view else False,
'icon': permobj.action.icon
}
else:
return {
'clientwise': False,
'add': False,
'change': False,
'delete': False,
'view': False,
'icon': ''
}

//在admin.py中添加以下代码,对于您需要执行的每个管理操作,//thing and need//以确保在表权限中添加类似的条目。

from module.function import check_role_permissions_admin
@admin.register(ConfigRuleMaster)
class ModelMasterAdmin(admin.ModelAdmin):
action_form=CustomActionForm
form = ModelMasterForm
fields=(('title','template'))
list_display=('title','template')
search_fields = ('title','template',)
list_display_links = []

def get_model_perms(self, request):
perms = decorators.check_role_permissions_admin(request, '/admin/lmt/modelmaster/')
perms['clientwise'] = False
return perms

def has_add_permission(self, request):
perms = decorators.check_role_permissions_admin(request, '/admin/lmt/modelmaster/')
return perms['add']

def has_change_permission(self, request, obj=None):
perms = decorators.check_role_permissions_admin(request, '/admin/lmt/modelmaster/')
return perms['change']
  • 另一项工作是通过装饰器处理操作。
  • 但是这是我在存储库中找到的非常原始的代码版本,您需要在非常高的级别上构建此逻辑,以使您的客户满意并拥有完全安全的代码。

    关于python - 在Django上实现多层角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53478559/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com