【问题标题】:Own Middleware for Restricting Users Django用于限制用户 Django 的自己的中间件
【发布时间】:2019-05-30 00:22:51
【问题描述】:

我将编写一个包含以下字段示例的模型。 user_idrole_idcompany_idfunctionality_idhas_access。我想编写中间件,用户将是raised NOT ACCESS,其中字段has_accessfalse。请帮助我该怎么做,由于我的依赖关系,我无法使用内置权限。我创建了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

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    您的课程 RestrictStaffToAdminMiddleware 用于 Django MIDDLEWARE_CLASSES 已弃用。在 Django >=1.10 中,它仍然支持旧版本,您也可以使用 MiddlewareMixin 使您的中间件兼容。

    我下面的课程是 MIDDLEWARE Django >1.10,当员工尝试访问管理页面时,将用户 is_staff 限制在管理委员会中

    • Django >=1.10
    • Python 3.6.8

    Django 文档:https://docs.djangoproject.com/en/1.11/topics/http/middleware/#upgrading-pre-django-1-10-style-middleware

    from django.core.urlresolvers import reverse
    from django.http import Http404
    
    # middleware.py
    class RestrictStaffFromAdminMiddleware(object):
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            if request.user.is_authenticated():
                if request.path.startswith(reverse('admin:index')):
                    if request.user.is_staff and not request.user.is_superuser:
                        raise Http404
    
            response = self.get_response(request)
            return response
    
        def process_exception(self, request, exception):
            return HttpResponse("in exception")
    

    【讨论】:

      【解决方案2】:

      在调用self.get_response 之前,您应该在中间件的__call__ 方法中进行必要的检查。它可能看起来像这样

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        • 2016-01-18
        • 2020-01-25
        • 1970-01-01
        相关资源
        最近更新 更多