Symfony2: Как защитить загруженные медиафайлы?

Я загрузил файлы, расположенные в /web/uploads, и мне нужно предоставить доступ только определенным пользователям. Мои пользователи не находятся в контексте безопасности (я знаю, что это плохое решение). Я думаю, что я должен переместить файлы из папки /web (например, /uploads) и создать контроллер, который будет обрабатывать доступ к файлам. Я прав или есть лучшее решение?

Версия Symfony 2.5.10.


person Oleksandr Savchenko    schedule 13.02.2015    source источник


Ответы (1)


Твой подход тверд. В действии контроллера вы можете настроить свои логические вызовы для проверки доступа к файлу.

Я бы порекомендовал создать для этого службу, чтобы вы могли повторно использовать ее за пределами этого конкретного контроллера, если это когда-либо понадобится.

Вы можете прочитать немного больше на http://symfony.com/doc/current/book/service_container.html

По своей сути Symfony поддерживает и продвигает сервис-ориентированную архитектуру, контроллеры существуют в основном для облегчения обработки объектов запросов и ответов.

person MichaelHindley    schedule 13.02.2015
comment
и сохраните свои файлы в БД как BLOB: 1. вам не нужно генерировать уникальные имена файлов 2. невозможна случайная перезапись 3. развертывание остается чище - person Aitch; 14.02.2015
comment
С точки зрения производительности я бы не рекомендовал сохранять файлы в виде больших двоичных объектов в базе данных. - person MichaelHindley; 16.02.2015
comment
И @Nihilnovi с опытной точки зрения, я бы не рекомендовал думать о производительности, если только ваши приемочные тесты не заставляли вас это делать. Мой намек только на то, что сохранение данных в базе данных намного чище и проще, чем запись на жесткий диск. Если этот доступ к БД является для вас узким местом, обеспечьте кэширование с помощью PHP или прокси-кэша. В любом случае автор удовлетворён вашим ответом. - person Aitch; 16.02.2015
comment
Я бы никогда не стал сохранять файлы в виде больших двоичных объектов в базе данных, если только у вас нет какой-либо архаичной системы, которая заставляет вас это делать. Я настоятельно рекомендую абстракцию файловой системы и граничные вычисления для обработки файлов, но это выходит за рамки этого вопроса, хорошей отправной точкой является пакет Flysystem, созданный PHP League, и страница википедии на ESI. github.com/thephpleague/flysystem en.wikipedia.org/wiki/Edge_Side_Includes - person MichaelHindley; 16.02.2015
comment
Я использовал flysystem и ESI. ESI — это опять же оптимизация (не знаю, зачем упоминать об этом здесь?). Я остановлюсь здесь. @Александр Савченко, может быть, просто пишет гостевую книгу. Он может сам решить иметь 2 или 3 строки в Doctrine или использовать ваше корпоративное решение :). - person Aitch; 16.02.2015
comment
Да ты прав. Сейчас мне не нужно решение для крупного предприятия. Я предпочитаю хранить файлы в файловой системе и защищать их контроллером Symfony. Спасибо. - person Oleksandr Savchenko; 16.02.2015