DJANGO разрешает доступ к определенному виду только из сети VPN - PullRequest
4 голосов
/ 28 июля 2010

Я пытаюсь указать доступ к определенному представлению django только клиенту, звонящему с VPN IP (10.8.0.3)

Мой сервер django поддерживается apache с использованием следующего .conf

<VirtualHost *>
    ServerAdmin webmaster@demo.cl
    DocumentRoot /home/project/virtualenvs/env1
    ServerName client1.project.cl
    ServerAlias www.client1.project.cl
    ErrorLog /var/log/apache2/error.log
    CustomLog /var/log/apache2/access.log combined

<Location "/">
SetHandler python-program
PythonHandler virtualhandler
SetEnv DJANGO_SETTINGS_MODULE project.settings
PythonOption django.root
SetEnv SITE_CLIENT_ID client1
PythonDebug On
PythonPath "['/home/project/virtualenvs/env1/django-site','/home/project/virtualenvs/env1/bin'] + sys.path"
</Location>

Alias /media "/home/project/virtualenvs/env1/lib/python2.6/site-packages/django/contrib/admin/media/"

<Location /media>
    SetHandler None
</Location>

<Location /nodesaccess >
        order Deny,Allow
        Deny from all
        Allow from 10.8.0.3
        SetHandler python-program
        PythonHandler virtualhandler
        SetEnv DJANGO_SETTINGS_MODULE project.settings
        PythonOption django.root
        SetEnv SITE_CLIENT_ID client1
        PythonDebug On
        PythonPath "['/home/project/virtualenvs/env1/django-    site','/home/project/virtualenvs/env1/bin'] + sys.path"

</Location>


</VirtualHost>

Эта предыдущая конфигурация позволяет создавать множество приложений django в зависимости от URL, я восстанавливаю переменную env, а затем apache загружает определенный файл setting.py, который является эксклюзивным и зависит от субдомена. Очень интересно

Все отлично работает (мои приложения) за исключением того, что в доступе нельзя отказать с помощью «Разрешить с 10.8.0.3»

Есть идеи?

Спасибо

Ответы [ 2 ]

1 голос
/ 25 мая 2014

Вы можете реализовать простое промежуточное ПО, которое будет блокировать любые запросы вне разрешенных IP-адресов:

from django.conf import settings
from django.core.urlresolvers import reverse, NoReverseMatch
from django.http import Http404

class InternalUseOnlyMiddleware(object):
    def process_request(self, request):
        try:
            admin_index = reverse('admin:index')
        except NoReverseMatch:
            return
        if not request.path.startswith(admin_index):
            return
        remote_addr = request.META.get(
            'HTTP_X_REAL_IP', request.META.get('REMOTE_ADDR', None))
        if not remote_addr in settings.INTERNAL_IPS and not settings.DEBUG:
            raise Http404

Оригинальный источник: https://djangosnippets.org/snippets/2095/

0 голосов
/ 28 июля 2010

Вы можете использовать REMOTE_ADDR из HttpRequest.META (http://docs.djangoproject.com/en/dev/ref/request-response/), чтобы проверить IP запрашивающего в вашем представлении. А если он отличается от того, который вы хотите, просто верните страницу 404 или 403.

...