【问题标题】:DJANGO allow access to a certain view only from a VPN NetworkDJANGO 仅允许从 VPN 网络访问特定视图
【发布时间】:2010-07-27 21:42:34
【问题描述】:

我试图将某个 django 视图的访问权限指定给从 VPN IP (10.8.0.3) 调用的客户端

apache 使用以下 .conf 支持我的 django 服务器

<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>

之前的配置允许根据 url 创建许多 django 应用程序,我恢复 env 变量,然后 apache 加载特定的 setting.py,它是独占的,取决于子域。很有趣

除了不能使用“Allow from 10.8.0.3”拒绝访问之外,一切正常(我的应用程序)

有什么想法吗?

谢谢

【问题讨论】:

    标签: django apache vpn


    【解决方案1】:

    您可以实现一个简单的中间件,该中间件将阻止允许的 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/

    【讨论】:

      【解决方案2】:

      您可以使用 HttpRequest.META (http://docs.djangoproject.com/en/dev/ref/request-response/) 中的 REMOTE_ADDR 在您的视图中检查请求者 IP。如果它与您想要的形式不同,则返回 404 或 403 页面。

      【讨论】:

      • 感谢您的回答,我开始测试该替代方案并且效果很好。将调用此私有视图的用户将通过 django 表单帖子插入数据,所以这里有另一个问题。 request.Meta.Remote_addr 可以伪造吗?希望不要谢谢
      • 你可以好好睡一觉了。通过使用将屏蔽客户端真实 IP 的代理服务器,可以“伪造”远程地址。但是在您的情况下,您使用的是本地 IP,因此外界没有机会使用此 IP 请求页面。限制单一视图访问的其他方法是使用用户。
      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 2020-04-09
      • 1970-01-01
      • 2020-10-06
      • 2017-11-27
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      相关资源
      最近更新 更多