zoukankan      html  css  js  c++  java
  • Django中间件之实现Admin后台IP白名单

    Django自带的Admin管理后台很方便,但是实际生产环境真的会有挺多安全问题的,在admin的安全防护这方面,我之前就研究实现了给admin加上登录验证码和限流功能,可以参考这篇文章:

    给Django Admin添加验证码和多次登录尝试限制

    不过就在内部使用的话就好很多,因此我们可以通过Django的中间件来实现IP过滤,所以本文中涉及到两个知识点,一个是Django的中间件,另外一个是Python关于IP这种数据结构的处理。

    开始进入正题吧~

    Django中间件

    关于中间件的概念和使用不是本文的重点,请读者自行参阅官方文档,写得很清楚易懂。

    首先我们新建一个Python包:middleware,创建一个Python文件admin_secure.py准备编写我们的中间件:

    import ipaddress
    
    from django.conf import settings
    from django.http.response import HttpResponseForbidden
    
    class AdminSecureMiddleware(object):
        """
        Admin 安全中间件
        用于限制可访问 admin 管理后台的IP段
        """
    
        admin_url = f'/{settings.URL_PREFIX}admin'
    
        allow_networks = [
            ipaddress.ip_network('10.53.0.0/20'),
        ]
    
        allow_addresses = []
    
        @classmethod
        def get_allow_addresses(cls):
            if len(cls.allow_addresses) > 0:
                return cls.allow_addresses
    
            for network in cls.allow_networks:
                for ip in network:
                    cls.allow_addresses.append(ip)
    
            return cls.allow_addresses
    
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            response = self.get_response(request)
    
            ip_addr = ipaddress.ip_address(request.META.get('REMOTE_ADDR'))
    
            if request.path.startswith(self.admin_url):
                if ip_addr not in self.get_allow_addresses():
                    return HttpResponseForbidden()
    
            return response
    

    注意上述代码,可以在allow_networks 中添加运行的IP网段,然后在settings.py中启用这个中间件就可以了。

    这里又引出了本文涉及的第二个知识点,就是Python的ipaddress操作。

    ipaddress模块

    我突然想偷懒一波,哈哈哈哈哈哈~

    因为这块真的挺简单的,官网文档是:https://docs.python.org/zh-cn/3/howto/ipaddress.html

    大学的计算机网络知识还没还给老师吧(逃~)

    参考资料

    欢迎交流

    我整理了一系列的技术文章和资料,在公众号「程序设计实验室」后台回复 linux、flutter、c#、netcore、android、kotlin、java、python 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~

  • 相关阅读:
    利用 .NET Framework 命令行工具
    和AI机器人Alice的一段聊天记录
    WINDOWS自启动程序的10大隐身之所
    开放式开发/开源项目TimeDog[C#WindowsApp]
    Microsoft月度中文速递
    新安装的VS2003出现了一个问题不能新建项目!
    实例构造器和类型构造器的一些比较
    C++ 模板里面的typename
    vim 折叠的用法
    Redis3:持久化
  • 原文地址:https://www.cnblogs.com/deali/p/13448275.html
Copyright © 2011-2022 走看看