2012-03-30 7 views
8

Nel mio progetto Symfony 2, ho una pagina che mostra informazioni su un'entità. In questa pagina c'è anche un link a un file associato a questa entità.Proteggi un collegamento per il download in Symfony 2

La pagina è protetta e può essere visualizzata solo se l'utente ha un ruolo specifico. Il ruolo atteso non è lo stesso per ogni entità, quindi è testato dinamicamente nell'azione.

Il mio problema è che anche se la pagina è protetta, chiunque può accedere al file tramite il suo URL. Mi piacerebbe che fosse scaricabile solo se il ruolo corrisponde a quello per la visualizzazione della pagina.

Qualche suggerimento su come dovrei farlo, o da dove cominciare a cercare?

+6

spostare il file al di fuori della web root, e quindi inviarlo all'utente mediante 'readfile()', se soddisfano i requisiti di sicurezza per scaricare il file. – halfer

risposta

14

Sposta il file all'esterno della directory pubblica in modo che non sia accessibile tramite un URL. Nel controller se un utente ha le autorizzazioni corrette quindi consentire all'utente di scaricare il file.

È possibile utilizzare questo nel controller:

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

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

Grazie anche a questa implementazione alcune ore dopo aver postato la domanda. Grazie comunque è sicuramente il modo migliore per farlo! – skwi

+2

Un miglioramento del codice precedente sarebbe quello di utilizzare StreamedResponse per generare il contenuto come parte del corpo SF 2.1 solo: http://symfony.com/doc/current/components/http_foundation.html#streaming-a-response – Josiah

+0

dovresti sempre trasmetterlo in streaming, perché con il codice sopra il tuo server web deve avere la stessa quantità di memoria della dimensione del file $ –

Problemi correlati