Собственное промежуточное ПО для ограничения пользователей Django - PullRequest
0 голосов
/ 03 января 2019

Я собираюсь написать модель, которая содержит следующий пример поля. user_id, role_id, company_id, functionality_id, has_access. Я хочу написать промежуточное программное обеспечение, где пользователь будет raised NOT ACCESS, где поле has_access равно false. Пожалуйста, помогите, как мне это сделать, и я не могу использовать встроенное разрешение из-за моих зависимостей. Я создал middleware.py и следовал официальному документу. Это только начало написания промежуточного программного обеспечения

class ACLMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

Я нашел ссылку на этот код, но я не знаю, правильный ли это способ, потому что я использую версию django 2.1

from django.core.urlresolvers import reverse
from django.http import Http404

    class RestrictStaffToAdminMiddleware(object):
        """
        A middleware that restricts staff members access to administration panels.
        """
        def process_request(self, request):
            if request.path.startswith(reverse('admin:index')):
                if request.user.is_authenticated():
                    if not request.user.is_staff:
                        raise Http404
                else:
                    raise Http404

1 Ответ

0 голосов
/ 03 января 2019

Вы должны поставить необходимые проверки в __call__ методе вашего промежуточного программного обеспечения перед вызовом self.get_response. Это может выглядеть так

def __call__(self, request):
    if not request.user.has_access:
        raise PermissionDenied

    response = self.get_response(request)

    # Code to be executed for each request/response after
    # the view is called.

    return response
...