Python 如何限制对Django中管理页面的访问?

Python 如何限制对Django中管理页面的访问?,python,django,django-admin,Python,Django,Django Admin,我需要Django管理界面,只有超级用户和工作人员在制作时才可以访问,并显示所有其他类型用户的404,包括未登录时。这可能吗?如何创建自己的管理员登录所需的装饰程序。 装饰者应该检查是否有用户以及该用户是否是管理员类型。如果没有用户,或者如果用户不是管理员,您可以重定向到登录页面或显示一条消息,说明用户未经授权 下面是一个如何为django视图编写装饰器的好例子 该页面描述了一个需要匿名的decorator示例,其中用户必须是匿名的。 您可以以这个例子为例,使用上面提供的规范实现一个管理员登录所

我需要Django管理界面,只有超级用户和工作人员在制作时才可以访问,并显示所有其他类型用户的404,包括未登录时。这可能吗?如何创建自己的管理员登录所需的装饰程序。 装饰者应该检查是否有用户以及该用户是否是管理员类型。如果没有用户,或者如果用户不是管理员,您可以重定向到登录页面或显示一条消息,说明用户未经授权

下面是一个如何为django视图编写装饰器的好例子

该页面描述了一个需要匿名的decorator示例,其中用户必须是匿名的。 您可以以这个例子为例,使用上面提供的规范实现一个管理员登录所需的装饰器,或者提出您自己的方案


祝你好运。

如果你使用默认的Django管理页面,Django已经有了内置的控件来限制对这些页面的访问。用户模型的
是\u staff
布尔值,用于控制用户是否有权访问Django管理页面。
is\u superuser
布尔值控制用户是否拥有所有权限,而不显式分配这些权限。但是,请注意,
是超级用户
授予对Django管理页面的访问权;您必须将
is_staff
设置为True,无论
is_superuser
的值如何,用户才能访问Django管理页面


但我不知道如果非工作人员用户试图访问Django管理界面,Django是否会引发404。我最后为它编写了一个中间件:

from django.core.urlresolvers import reverse
from django.http import Http404

class RestrictStaffToAdminMiddleware(object):
    """
    A middleware that restricts staff members access to administration panels.
    """
    def process_request(self, request):
        if request.path.startswith(reverse('admin:index')):
            if request.user.is_authenticated():
                if not request.user.is_staff:
                    raise Http404
            else:
                raise Http404

在URL中使用AdminSite类之前,覆盖该类的admin_视图部分

在admin.py文件(如果没有,请创建)中添加:

然后在URL文件中添加:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.views.defaults import page_not_found

from my_project.admin import admin_view
admin.site.admin_view = admin_view

urlpatterns = patterns('',
    url(r'^admin/login/', page_not_found),
    url(r'^admin/', include(admin.site.urls)),
)

当然,如果您仍然希望找到登录名,请删除url(r“^admin/login/”,page\u not\u found)行。

我创建了@ip.中间件的更新版本。这使用
process\u view
直接检查视图是否是管理员站点的成员,而不仅仅是检查URL是否在管理员站点上。如果未经授权的用户试图访问管理站点,它还会添加一个警告日志条目,并简化
if
逻辑。这是为Python 3和Django 2编写的

从检查导入getmodule
导入django.contrib.admin.sites
从django.http导入Http404
导入日志记录
logger=logging.getLogger(_名称__)
类限制StaffToAdminMiddleware:
"""
限制工作人员访问管理面板的中间件。
"""
定义初始化(自我,获取响应):
self.get\u response=get\u response
定义呼叫(自我,请求):
响应=自我获取响应(请求)
返回响应
def进程视图(自身、请求、视图函数、视图参数、视图参数):
模块=获取模块(查看功能)
如果(模块是django.contrib.admin.sites)和(不是request.user.is_staff):
ip=request.META.get('HTTP\u X\u REAL\u ip',request.META.get('REMOTE\u ADDR'))
ua=request.META.get('HTTP\u USER\u AGENT')
logger.warn(f'Non-staff user“{request.user}”试图在“{request.get_full_path()}”访问管理站点。UA=“{UA}”,IP=“{IP}”,Method={request.Method}”)
提高Http404

我建议提高403(禁止)而不是404(找不到页面),为什么?我不希望普通用户有任何知识或访问它。这确实大大降低了加载速度,因为每次向服务器发送请求(例如图像等)时,它都会转到中间件进行验证。为管理员视图编写装饰程序似乎更有效。我应该在哪里添加此代码
from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.views.defaults import page_not_found

from my_project.admin import admin_view
admin.site.admin_view = admin_view

urlpatterns = patterns('',
    url(r'^admin/login/', page_not_found),
    url(r'^admin/', include(admin.site.urls)),
)