我需要Django管理界面只能在超级用户和工作人员在制作时访问,并显示所有其他类型用户的404,包括未登录时。这可能吗?如何?
答案 0 :(得分:6)
我最终为它编写了一个中间件:
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
答案 1 :(得分:1)
在URL中使用之前,覆盖AdminSite类的admin_view部分。
在admin.py文件中(如果没有,请创建它)添加:
from functools import update_wrapper
from django.http import Http404
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
def admin_view(view, cacheable=False):
"""
Overwrite the default admin view to return 404 for not logged in users.
"""
def inner(request, *args, **kwargs):
if not request.user.is_active and not request.user.is_staff:
raise Http404()
return view(request, *args, **kwargs)
if not cacheable:
inner = never_cache(inner)
# We add csrf_protect here so this function can be used as a utility
# function for any view, without having to repeat 'csrf_protect'.
if not getattr(view, 'csrf_exempt', False):
inner = csrf_protect(inner)
return update_wrapper(inner, view)
然后在你的网址文件中添加:
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)),
)
当然,如果您仍然希望找到登录信息,请删除网址(r'^ admin / login /',page_not_found)。
答案 2 :(得分:0)
您可以创建自己的admin_login_required装饰器。 装饰者应检查是否有用户以及用户是否为管理员类型。如果没有用户,如果用户不是管理员,您可以重定向到登录页面或显示一条消息,说明用户未经授权。
这是一个如何为django视图编写装饰器的好例子。 http://passingcuriosity.com/2009/writing-view-decorators-for-django/
该页面描述了anonymous_required装饰器的一个示例,其中用户必须是匿名的。 您可以使用我在上面提供的规范获取该示例并实现admin_login_required装饰器,或者提出您自己的方案。
祝你好运。答案 3 :(得分:0)
如果您使用默认的Django管理页面,Django已经内置控件来限制对这些页面的访问。用户模型的is_staff
布尔值控制用户是否可以访问Django管理页面。 is_superuser
布尔值控制用户是否具有所有权限而不显式分配它们。但请注意,is_superuser
将不授予对Django管理页面的访问权限;您必须将is_staff
设置为True,而不管is_superuser
的值是否允许用户访问Django管理页面。
https://docs.djangoproject.com/en/1.6/ref/contrib/auth/#django.contrib.auth.models.User.is_staff
但是,如果非员工用户试图访问Django管理界面,我不知道Django是否会筹集404.
答案 4 :(得分:0)
我创建了@ip。中间件的更新版本。它使用process_view
直接检查视图是否是管理站点的成员,而不是仅检查URL是否在管理站点上。如果未经授权的用户尝试访问管理站点,它还会添加警告日志条目,并简化if
逻辑。这是为Python 3和Django 2编写的。
from inspect import getmodule
import django.contrib.admin.sites
from django.http import Http404
import logging
logger = logging.getLogger(__name__)
class RestrictStaffToAdminMiddleware:
"""
A middleware that restricts staff members access to administration panels.
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
module = getmodule(view_func)
if (module is django.contrib.admin.sites) and (not request.user.is_staff):
ip = request.META.get('HTTP_X_REAL_IP', request.META.get('REMOTE_ADDR'))
ua = request.META.get('HTTP_USER_AGENT')
logger.warn(f'Non-staff user "{request.user}" attempted to access admin site at "{request.get_full_path()}". UA = "{ua}", IP = "{ip}", Method = {request.method}')
raise Http404