この記事について
設定した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
デコレータでの実装方法
参考資料:
- Top 6 Django Decorators
- DjangoにおけるDecoratorの使い方とその作り方
- DjangoでViewのデコレーターをurls.pyに書くと一覧性が高くなる
- Djangoでurls.pyのincludeにデコレーターを付ける方法
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')
]