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.0.tar.gz (13.6 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.0-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for edu_secure_media-0.2.0.tar.gz
Algorithm Hash digest
SHA256 e16cc1aabdcc720c4fbb8d34554a4bdcbea66c9741a6f8f01dab3ab21fbd95fb
MD5 5b76c1fefabbf3a91a60fee2a97231d8
BLAKE2b-256 671ed7ccfc487c8843e3b4d2d14f07cddeff918ceedbe41616185f55a531ba9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edu_secure_media-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bb53fbfc13a69e29c254e3bf91a1d5249d9c33383539ec1db39a07b83c13cf99
MD5 d773447654d2ca432235c081599dd9c3
BLAKE2b-256 e14c377bf640744be657eaf862660a6d52432421f47d29d2abc1fda59c8cf9cd

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