Django REST framework - разрешить доступ только к списку IP-адресов?
Я пытаюсь понять, как правильно ограничить доступ к конечной точке API
с помощью IP address
. Я просмотрел документацию, блокировка упоминается, но ограничение вызова конечной точки API
не упоминается.
Какой правильный способ сделать это?
В зависимости от архитектуры вашего сервера вы можете достичь этого явно программно, путем:
def retrieve_user_ip(request):
user_ip = request.META.get('HTTP_X_FORWARDED_FOR')
if user_ip:
ip = user_ip.split(',')[-1] # According to Wiki, have to grab last element from HTTP_X_FORWARDED_FOR header
else:
ip = request.META.get('REMOTE_ADDR') # Basing on Django docs https://docs.djangoproject.com/en/4.0/ref/request-response/#django.http.HttpRequest.META
return ip
Вы можете сделать пользовательское разрешение на проверку наличия ip-адреса в списке безопасных ip-адресов и установить его в DEFAULT_PERMISSION_CLASSES.
Что-то вроде:
class SafeIPPermission(permissions.BasePermission):
def has_permission(self, request, view):
if ip := request.META.get('HTTP_X_FORWARDED_FOR'):
ip = ip.split(',')[-1]r
else:
ip = request.META.get('REMOTE_ADDR')
return ip IN settings.SAFE_IPS
А в настройках:
SAFE_IPS = [
127.0.0.1,
10.0.0.1,
...
]
...
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
...
'path.to.custom.permissions.SafeIPPermission',
...
]
}