繁体   English   中英

在Django上实现多层角色

[英]Implementing multi layer role on Django

使用django组和权限。 通常工作正常。 现在想添加只能授予特定模型权限的子管理员。 如何执行?

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

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

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

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

  4. 使用诸如check_role_permissions_admin类的常用功能检查Admin中的角色和权限

//在单独的/通用功能文件中添加以下功能。

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中添加以下代码,对于每个管理员操作,您都需要遵循以下步骤,并且//需要确保在表权限中添加了类似的条目。

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']
  1. 另一项工作是通过装饰器处理动作。

但是,这是我在存储库中找到的非常原始的代码版本,您需要在非常高的层次上使此逻辑生效,以使您的客户端满意并拥有完整的安全代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM