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',
        ...
    ]
}
Вернуться на верх