如何限制普通用户访问Django内置Admin页面并返回404错误?
实现Django Admin仅对管理员可见(非管理员返回404)
可以通过自定义AdminSite并包装所有视图的方式实现需求,完全覆盖Django内置Admin的默认授权逻辑,让未认证或非工作人员访问时直接返回404。
步骤1:编写自定义权限校验装饰器
创建一个装饰器,校验用户是否为已认证的工作人员,不符合则抛出404异常:
from django.http import Http404 def admin_or_404(view_func): def wrapped_view(request, *args, **kwargs): # 仅允许已认证且标记为工作人员的用户访问 if not (request.user.is_authenticated and request.user.is_staff): raise Http404("Page not found") return view_func(request, *args, **kwargs) return wrapped_view
步骤2:自定义AdminSite类
继承Django内置的AdminSite,重写get_urls方法,给所有Admin视图加上上面的装饰器:
from django.contrib.admin import AdminSite class CustomAdminSite(AdminSite): def get_urls(self): # 获取默认的Admin URL配置 urls = super().get_urls() # 遍历所有URL,给视图函数添加权限校验 for url in urls: if hasattr(url, 'callback'): url.callback = admin_or_404(url.callback) return urls # 实例化自定义的Admin站点 custom_admin_site = CustomAdminSite(name='custom_admin')
步骤3:替换默认的Admin注册方式
将原来通过admin.site.register()注册的模型,改为使用自定义的custom_admin_site:
# 示例:在你的app的admin.py中 from .custom_admin import custom_admin_site from .models import YourModel, AnotherModel custom_admin_site.register(YourModel) custom_admin_site.register(AnotherModel)
步骤4:更新URL配置
在项目根目录的urls.py中,替换默认的Admin路径为自定义站点的URL:
from django.urls import path from yourapp.custom_admin import custom_admin_site # 替换为你的app名称 urlpatterns = [ # 移除原来的path('admin/', admin.site.urls) path('admin/', custom_admin_site.urls), # 其他URL配置... ]
效果说明
- 已认证且
is_staff=True的管理员用户可以正常访问Admin页面 - 未认证用户或非工作人员访问任何Admin路径(包括
/admin/login/)时,都会直接返回404错误,完全隐藏Admin的存在
内容的提问来源于stack exchange,提问作者Daniil456
相关产品推荐
相关产品推荐

