You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现限制非超级管理员访问的Django自定义权限中间件?

Django自定义超级管理员权限控制中间件

需求说明

  • 限制非超级管理员用户访问panel.urls路由下的所有页面
  • 允许超级管理员用户自由访问panel.urls路由

现有URL配置

当前项目根路由urls.py配置如下:

path('panel/', include('panel.urls')),
path('', include('base.urls')),

自定义中间件实现

在panel应用下创建middleware.py,编写如下中间件代码:

# panel/middleware.py

from django.shortcuts import redirect
from django.urls import reverse

class AdminRestrictMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 检测请求路径是否属于panel路由
        if request.path.startswith('/panel/'):
            # 用户已登录但不是超级管理员,跳转到权限受限页面
            if request.user.is_authenticated and not request.user.is_superuser:
                return redirect(reverse('restricted_access'))
            # 用户未登录,跳转到登录页面
            elif not request.user.is_authenticated:
                return redirect(reverse('login'))
        
        # 符合权限要求,继续处理请求
        response = self.get_response(request)
        return response

中间件生效配置

需要在项目settings.py的MIDDLEWARE列表中添加该中间件,尽量放在认证中间件之后(比如django.contrib.auth.middleware.AuthenticationMiddleware之后),确保能正确获取request.user对象:

MIDDLEWARE = [
    # ... 其他中间件
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 添加自定义中间件
    'panel.middleware.AdminRestrictMiddleware',
    # ... 其他中间件
]

代码逻辑说明

  • 当请求路径以/panel/开头时触发权限校验
  • 未登录用户直接跳转至登录页面
  • 已登录但非超级管理员用户跳转至权限受限页面(需确保restricted_access路由已提前定义)
  • 超级管理员用户可正常访问panel下的所有页面

内容的提问来源于stack exchange,提问作者shyam rathod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:13:25