Реализация многослойной роли в Django - PullRequest
0 голосов
/ 26 ноября 2018

Работа с django Group и Permission.Нормально работает нормально.Теперь хочу добавить саб админа, который может дать разрешение только конкретной модели.Как реализовать?

1 Ответ

0 голосов
/ 26 ноября 2018

Согласно нашему обсуждению ниже, мои Шаги:

  1. Переопределить роль с компанией ИЛИ вы можете оставить это на уровне Супер Администратора.http://127.0.0.1:8000/admin/auth/role/

  2. Добавить отдельную таблицу для разрешений со столбцами pk, ID клиента, RoleID, добавить, изменить, просмотреть, удалить, модель, действие (URL)

  3. Добавьте декоратор для каждого действия или модели и проверьте разрешения для этого конкретного действия или модели.

  4. Проверьте роли и разрешения в Admin с помощью общей функции, например, check_role_permissions_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, для каждого действия администратора, которое вам необходимо выполнить после // thing и нужно // чтобы убедиться, что аналогичная запись добавлена ​​в разрешения таблицы.

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']
Другая работа заключается в обработке действий через декораторы.

Но это очень сырая версия кода, которую я нашел в моем репозитории, вам нужно сделать эту логику на очень высоком уровне, чтобы ваш клиент был доволен и имел полностью защищенный код.

...