Skip to main content

No project description provided

Project description

Пакет для проверки авторизации пользователя перед доступом к /media/


Установка и настройка

  1. Установить пакет в окружение: pip install edu-secure-media Также можно установить m3 расширения: pip install edu-secure-media[m3] и\или drf расширения: pip install edu-secure-media[drf]
  2. В основном urls.py расширить urlpatterns
    # Пример использования в ЭШ:
    from edu_secure_media.urls import (
        urlpatterns as secure_urls,
    )
    
    urlpatterns += secure_urls
    
    либо DRF версию
    from edu_secure_media.contrib.drf.urls import  urlpatterns as secure_media_urls
    
    urlpatterns += secure_media_urls
    
  3. Добавить в settings.py параметры:
  • SECURE_MEDIA_SECRET_KEY
  • SECURE_MEDIA_TRUSTED_HOST_PATHS
    # Пример использования:
    SECURE_MEDIA_TRUSTED_HOST_PATHS = conf.get('secure_media', 'trusted_host_paths').replace(' ', '') or ''
    
  • SECURE_MEDIA_HASHING_ALG (по умолчанию 'sha1')
  • SECURE_MEDIA_DESCRIPTOR_PARAM_NAME (по умолчанию 'desc')
  • SECURE_MEDIA_PUBLIC_DESCRIPTOR_NAME (по умолчанию 'Public')
  • SECURE_MEDIA_HANDLERS
    # Пример использования с разъяснением в разделе "Параметры SECURE_MEDIA_HANDLERS"
    
  • Для django-sendfile:
    • SENDFILE_BACKEND
     # Пример использования для машины разработчика:
     SENDFILE_BACKEND = conf.get('secure_media', 'backend') or 'django_sendfile.backends.development'
    
     # Пример использования для тестовых и production серверов:
     SENDFILE_BACKEND = conf.get('secure_media', 'backend') or 'django_sendfile.backends.nginx'
    
    • SENDFILE_URL
    # Адрес, на который будет перенаправлен запрос в случае, если авторизация прошла успешна. 
    # Адрес не должен заканчиваться слешем. Пример использования:
    SENDFILE_URL = conf.get('secure_media', 'url') or '/protected'
    
    • SENDFILE_ROOT = MEDIA_ROOT
    SENDFILE_ROOT всегда равен MEDIA_ROOT, 
    директория с файлами, для отдачи которых требуется авторизация.
    
  1. Для тестовых и production серверов в конфигурационном файле проекта задать параметры
    [secure_media]
    backend = django_sendfile.backends.nginx
    # URL на который будет перенаправляться запрос
    url = /protected
  1. Для тестовых и production серверов сконфигурировать NGINX.
    Для url из параметров необходимо задать секцию location в конфигурационном файле NGINX.

Алгоритм обработки запроса на тестовых и production серверах:

Поступает запрос от клиента на URL /media/*. NGINX принимает запрос и передает проксируемому серверу (django, gunicorn). Этот запрос не кэшируется.
Пример конфигурации:

location / {
    proxy_pass http://localhost:8000;
    include proxy_params;
    charset utf-8;
    chunked_transfer_encoding off;
}
location /media/ {
    proxy_pass http://localhost:8000/media/;
    # Не кэшируем запрос на клиенте
    expires -1;
}

Запрос обрабатывается в Django view. Если запрашиваются файлы в /media/public, то они отдаются без каких-либо проверок. Если пользователь не авторизован, то на клиент возвращается json с сообщением. Если пользователь авторизован, то запрос перенаправляется на URL заданный параметром SENDFILE_URL. location для него должен быть задан в конфигурационном файле NGINX

location /protected/ {
    # Обрабатываются внутренние запросы
    internal;
    # Если для nginx используется докер, путь к media должен соответствовать пути, 
    # в который смонтирована директория с медиафайлами.
    alias /home/ivahotin/dev/kinder_conf/media/;
    # Отключаем кеширование в браузере
    expires -1;
}

Параметры SECURE_MEDIA_HANDLERS

# Пример использования в ЭШ:
SECURE_MEDIA_HANDLERS = [
    [
        None,
        'edu_secure_media.handlers.common.check_path_traversal_attack',
    ],
    [
        None,
        'edu_secure_media.handlers.common.allow_host_handler',
    ],
    [
        None,
        'edu_secure_media.handlers.common.allow_prefixes_handler',
        {
            'prefixes': [
                'public/',
            ]
        },
    ],
    [
        None,
        'edu_secure_media.handlers.m3.allow_admin_only_handler',
        {
            'prefixes': [
                'downloads/admin/',
                'uploads/edu_rdm_integration/',
                f'{RDM_COLLECT_LOG_DIR}/'
                f'{RDM_EXPORT_LOG_DIR}/',
            ],
            'join_media_url': True,
        }
    ],
    [
        None,
        'edu_secure_media.handlers.common.allow_authenticated_handler',
    ],
    [
        'Public',
        'edu_secure_media.handlers.common.always_allow_handler',
    ],
    [
        '#/emie_school/*',
        'edu_secure_media.handlers.common.delegate_to_model_handler',
    ],
    [
        '*',
        'edu_secure_media.handlers.common.always_allow_handler',
    ]
]

Список handler'ов определяющих доступность файла по его ссылке.

Каждый элемент списка это список из 3х элементов:

  • pattern для сопоставления или None. Если None, то хендлер функция будет вызываться для всех ссылок, иначе только для тех у которых pattern совпадает с дескриптором ссылки. Паттерны сопоставляются модулем fnmatch.
  • Путь к хендлер функции, которая будет вызвана
  • Словарь именнованных аргуметов для хендлер функции

Хендлеры вызываются по порядку. Каждый handler должен вернуть одно из 4-х значений:

  • True - Если доступ разрешается
  • False - Если доступ запрещается
  • HttpResponse - Если нужно вернуть ответ "как есть"
  • None - Если хендлер не смог однозначно нужно дать доступ или нет

Если один из handler'ов возвращает True, False или HttpResponse, обработка прерывается, если же None, то обрабатываются следующие handler'ы.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edu_secure_media-0.2.1.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

edu_secure_media-0.2.1-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file edu_secure_media-0.2.1.tar.gz.

File metadata

  • Download URL: edu_secure_media-0.2.1.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for edu_secure_media-0.2.1.tar.gz
Algorithm Hash digest
SHA256 1b0214d8b84fcd5fe3ebda305282007335902492b0f54ac8f4f8c459d882d236
MD5 f1c0a31fc062af160f77ebf78e08d824
BLAKE2b-256 538f7cddf07a600853c023a120e6846d77451bcf9b065a58741a77b85d25aa03

See more details on using hashes here.

File details

Details for the file edu_secure_media-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for edu_secure_media-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b2e60169bc4a1b7738f26fcb3e8deac579013134e9e208d7ec7495816f4e12a5
MD5 6a000c238c0c1729e058211d559a29fa
BLAKE2b-256 259701a0cf1a7102ad4a2ff11a7dd584d6178b837710fa58b1e82430c86b26dd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page