1. 程式人生 > 實用技巧 >Django中介軟體之實現Admin後臺IP白名單

Django中介軟體之實現Admin後臺IP白名單

Django自帶的Admin管理後臺很方便,但是實際生產環境真的會有挺多安全問題的,在admin的安全防護這方面,我之前就研究實現了給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 等可獲取相關技術文章和資料,同時有任何問題都可以在公眾號後臺留言~