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

如何限制普通用户访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:09:19