Django中间件之实现Admin后台IP白名单
前言 Django自带的Admin管理后台很方便,但是实际生产环境真的会有挺多安全问题的,在admin的安全防护这方面,我之前就研究实现了给admin加上登录验证码和限流功能,可以参考这篇文章:给Django Admin添加验证码和多次登录尝试限制 不过就在内部使用的话就好很多,因此我们可以通过Django的中间件来实现IP过滤,所以本文中涉及到两个知识点,一个是Django的中间件,另外一个是P
目录5 个章节
前言
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 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~
_EOF_
Django中间件之实现Admin后台IP白名单
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
在 django-ninja 中实现类似腾讯阿里云的应用鉴权机制
Django-Ninja API鉴权机制?不就是又一套基于AppClient的认证系统,支持查询参数、请求头、Bearer Token认证,外加IP白名单和scopes权限控制?代码写得够复杂,够绕?
2025-07-10 · Django · 约 1 分钟
Django-Import-Export插件控制数据导入流程
前言 之前写过两篇跟这个插件有关的文章,可以回顾一下: Django数据导入导出神器django-import-export使用 Django-Import-Export插件关于外键的处理 最近有个朋友留言问我一个关于django-import-export插件的问题 为了形象表达这个问题,我举个书籍管理的例子来描述一下 数据库表 | id | name | price | | ---- |
2022-09-02 · Django · 约 1 分钟
轻量级消息队列Django-Q轻度体验
前言 最近做的这个项目(基于Django),需要做个功能,实现定时采集车辆定位。 这让我想起来几年前那个OneCat项目,当时我用的是Celery这个很重的组件 Celery实在是太重了,后来我做公众号采集平台的时候,又接触了Django-RQ和Django-Q这俩,前者是对RQ的封装,让RQ和Django更好的结合在一起;后者是一个全新的「多进程任务队列」组件,相比起celery很轻量,当时使用
2022-08-31 · Django · 约 1 分钟
不同Django服务器和部署方式的性能调研
WSGI 排名靠前?uWSGI 才是王道。ASGI 增加复杂度,性能还差一截。腾讯云服务器性能还掉线?真是够了。
2025-11-28 · Django · 约 1 分钟
讨论
共 0 条加载评论中…