如何实现限制非超级管理员访问的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
相关产品推荐
相关产品推荐

