#python #django #django-admin
#python #django #django-admin
Вопрос:
Мне нужно, чтобы интерфейс администратора Django был доступен только для суперпользователей и персонала при работе и отображал 404 всех других типа пользователей, включая тех, кто не вошел в систему. Возможно ли это и как?
Комментарии:
1. Я решил не делать вышеупомянутого, потому что штатные пользователи могут открыть ссылку, которую они в идеале должны иметь возможность видеть, но только потому, что они не вошли в систему или срок их сеанса истек, они получат 404 вместо простого перенаправления для входа. 404 может быть не так важен для показа обычным пользователям / заказчикам, особенно когда необходимые изменения могут быть не совсем понятными и могут содержать неизвестные ошибки, которые, вероятно, не все могут быть протестированы. Django уже ограничивает все просмотры администратором, проверяя, является ли пользователь штатным пользователем.
Ответ №1:
В итоге я написал для него промежуточное программное обеспечение:
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. Я бы предложил поднять 403 (запрещено) вместо 404 (страница не найдена)
2. Почему? Я не хочу, чтобы обычные пользователи имели какие-либо знания или доступ к нему.
3. это действительно резко снижает скорость загрузки, потому что каждый раз, когда на сервер отправляется запрос, например, на изображения и т.д., Он отправляется промежуточному программному обеспечению для проверки. Написание декоратора для представления администратора кажется более эффективным.
Ответ №2:
Перезапишите часть admin_view класса AdminSite, прежде чем использовать ее в URL-адресах.
В 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)
а затем в вашем файле urls добавьте:
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_not_found).
Ответ №3:
Если вы используете страницы администратора 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 404, если внештатный пользователь попытается получить доступ к интерфейсу администратора Django.
Ответ №4:
Я создал обновленную версию промежуточного программного обеспечения @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
Ответ №5:
Вы можете создать свой собственный декоратор admin_login_required. Декоратор должен проверить, есть ли пользователь и относится ли он к типу администратора. Если пользователя нет, или если пользователь не является администратором, вы можете перенаправить на страницу входа в систему или отобразить сообщение о том, что пользователь неавторизован.
Вот хороший пример того, как написать декоратор для представления django. http://passingcuriosity.com/2009/writing-view-decorators-for-django /
На странице описан пример декоратора anonymous_required, где пользователь должен быть анонимным. Вы можете взять этот пример и реализовать декоратор admin_login_required, используя спецификации, которые я предоставил выше, или придумать свои собственные сценарии.
Удачи.
Ответ №6:
Вы можете использовать этот пакет django-admin-ip-restrictor и установить ограничение ip только для просмотра администратором.
Для установки пакета :
pip install django-admin-ip-restrictor
Например, в вашем settings.py
MIDDLEWARE = [
...,
admin_ip_restrictor.middleware.AdminIPRestrictorMiddleware
]
RESTRICT_ADMIN=True
ALLOWED_ADMIN_IPS=['127.0.0.1']
ALLOWED_ADMIN_IP_RANGES=['127.0.0.0/24']
RESTRICTED_APP_NAMES=['admin']
TRUST_PRIVATE_IP=True