2012-03-30 12 views
8

En mi proyecto Symfony 2, tengo una página que muestra información sobre una entidad. En esta página también hay un enlace a un archivo asociado a esta entidad.Asegure un enlace de descarga en Symfony 2

La página está asegurada y solo se puede mostrar si el usuario tiene un rol específico. El rol esperado no es el mismo para cada entidad, por lo que se prueba dinámicamente en la Acción.

Mi problema es que incluso si la página es segura, cualquiera puede acceder al archivo a través de su URL. Me gustaría que fuera descargable solo si el rol coincide con el de la pantalla de la página.

¿Alguna sugerencia sobre cómo debería hacerlo o dónde empezar a buscar?

+6

mover el archivo fuera de la raíz de la tela, y luego enviarlo al usuario el uso de 'readfile()', si cumplen con los requisitos de seguridad para descargar el archivo. – halfer

Respuesta

14

Mueva el archivo fuera del directorio público para que no sea accesible a través de una URL. En el controlador si un usuario tiene los permisos correctos, entonces permita al usuario descargar el archivo.

Usted podría utilizar esto en su controlador:

$headers = array('Content-Type'  => 'application/pdf', 
       'Content-Disposition' => 'inline; filename="file1.pdf"'); 

return new Response(file_get_contents($file), 200, $headers); 
+1

Gracias también pensé en implementarlo unas horas después de publicar la pregunta. ¡De todos modos, seguro que es la mejor manera de hacerlo! – skwi

+2

Una mejora del código anterior sería utilizar StreamedResponse para generar el contenido solo como parte del cuerpo SF 2.1: http://symfony.com/doc/current/components/http_foundation.html#streaming-a-response – Josiah

+0

siempre debe transmitirlo, porque con el código anterior su servidor web necesita tener tanta memoria como el tamaño del archivo $ –