Django如何限制已登录管理员未经授权访问非权限内管理页面
Django限制未授权用户访问指定路由的解决方案
你可以通过以下3种常用方案实现权限校验,阻止无权限用户直接访问/logistic/路径:
方案1:视图层加权限校验装饰器(最常用)
函数式视图(FBV)场景
使用Django内置的permission_required装饰器,给/logistic/对应的视图函数加权限校验规则:
from django.contrib.auth.decorators import permission_required # 第一个参数为需要的权限标识,没有权限的用户会被重定向到login_url指定的地址 @permission_required('your_app.access_logistic', login_url='/home/') def logistic_view(request): # 原有视图逻辑 ...
你需要提前在Django后台给允许访问/logistic/的角色分配access_logistic权限,没有该权限的已登录用户会直接跳转回/home/页面。
类视图(CBV)场景
继承PermissionRequiredMixin类,指定需要的权限即可:
from django.contrib.auth.mixins import PermissionRequiredMixin from django.views.generic import TemplateView class LogisticView(PermissionRequiredMixin, TemplateView): permission_required = 'your_app.access_logistic' login_url = '/home/' template_name = 'logistic.html'
方案2:自定义中间件做全局路由拦截
如果有大量需要权限校验的路由,可以自定义中间件统一拦截校验:
- 新建
middleware.py文件,添加如下代码:
from django.shortcuts import redirect from django.urls import resolve class RoutePermissionMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): current_path = request.path # 匹配需要校验的路由 if current_path.startswith('/logistic/'): # 校验用户是否有对应权限 if not request.user.has_perm('your_app.access_logistic'): return redirect('/home/') response = self.get_response(request) return response
- 在
settings.py的MIDDLEWARE列表中注册该中间件即可生效。
方案3:路由层直接加权限校验
如果不想修改视图代码,也可以在urls.py中给对应路由包裹装饰器:
from django.contrib.auth.decorators import permission_required from .views import logistic_view urlpatterns = [ ... path('logistic/', permission_required('your_app.access_logistic', login_url='/home/')(logistic_view), name='logistic'), ]
注意:如果你的
/logistic/路径只允许超级管理员访问,可以把权限校验逻辑替换为request.user.is_superuser判断即可,不需要额外自定义权限。
内容的提问来源于stack exchange,提问作者Rainysky
相关产品推荐
相关产品推荐

