Skip to main content

No project description provided

Project description

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


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

  1. Установить пакет в окружение: pip install edu-secure-media
  2. В основном urls.py расширить urlpatterns.
# Пример использования в ЭШ:
from edu_secure_media.urls import (
    urlpatterns as secure_urls,
)

urlpatterns += secure_urls
  1. Добавить в 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.1.2.tar.gz (11.9 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.1.2-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: edu_secure_media-0.1.2.tar.gz
  • Upload date:
  • Size: 11.9 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.1.2.tar.gz
Algorithm Hash digest
SHA256 543dd80578e04ce2d29b4414ccff1921180c31e6ec0c91cbf7100aa62b9f158b
MD5 7a93fedd14683e24c06deec33ab4e463
BLAKE2b-256 75152d925f8aa7a1f8c02ada2705ad480d401f70ad5f322724aef8843d159832

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for edu_secure_media-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 642f81d3566b48f240b40cc0d71bfe3d468bb9479ce5afb1b967df018ab6588d
MD5 e81a3cb7b200338a45e6439808aded35
BLAKE2b-256 474f7ca4f803f51c08bad08e5525004320e14f35559fda0686a11d8a6d4455e8

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