LoginSignup
19
19

More than 5 years have passed since last update.

[Django] IPアドレスを使ったアクセス制限のかけ方

Posted at

この記事について

設定したIPアドレスからのみアクセスを許可するためのサンプルコードです。Webサーバの設定でも可能ですが、アプリケーション側でかけることもできます。

サンプルコード

動くコードはこちら
https://github.com/okoppe8/django-ip-restrict-example

以下の方針で実装しましょう。

  • アプリ全体に制限を掛けるならミドルウェアを使う
  • 部分的に制限を掛けるならデコレータを使う

この例ではIPアドレスを設定ファイルに定義していますが、データベースから取得するようすると動的な管理も可能です。

  • 事業所が増えたときにユーザー側で設定を追加する。
  • IPアドレスを確認するツールを使って、管理者が個人のスマホに一時的にアクセス許可を与える。

という運用ができます。

ミドルウェアでの実装方法

参考:Qiita:DjangoのMiddlewareについて

settings.py

MIDDLEWARE = [
    ....
    '<app_name>.middlewares.IpRestrictMiddleware',
]

ALLOWED_IP_BLOCKS = ['....', ]
middlewares.py
from django.http import HttpResponse
from django.template.loader import get_template

from <project_name> import settings


class IpRestrictMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        ip = request.META['REMOTE_ADDR']

        if ip not in settings.ALLOWED_IP_BLOCKS:
            temp = get_template('not_allowed_ip.html')
            result = temp.render({'ip': ip})
            return HttpResponse(result)

        response = self.get_response(request)

        return response

デコレータでの実装方法

参考資料:

settings.py
ALLOWED_IP_BLOCKS = ['....', ]
decorators.py
from django.http import HttpResponse
from django.template.loader import get_template

from ip_restrict import settings


def ip_restriction(func):
    def check_ip(request, *args, **kwargs):

        ip = request.META['REMOTE_ADDR']
        if ip not in settings.ALLOWED_IP_BLOCKS:
            temp = get_template('not_allowed_ip.html')
            result = temp.render({'ip': ip})
            return HttpResponse(result)
        return func(request, *args, **kwargs)

    return check_ip

urls.py
from django.urls import path
from django.views.generic import TemplateView
from .decorators import ip_restriction


urlpatterns = [
    path('', ip_restriction(TemplateView.as_view(template_name='index.html')), name='index')
]
19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19