2015-06-06 16 views
13

Ich habe Laravel 5.0 installiert und Authentifizierung vorgenommen. Alles funktioniert gut.Wie schützt man das Bild vor der Öffentlichkeit in Laravel 5?

Meine Website ist nur für authentifizierte Mitglieder geöffnet. Der darin enthaltene Inhalt ist nur für authentifizierte Mitglieder geschützt. Die Bilder auf der Website sind jedoch nicht für die öffentliche Ansicht geschützt.

Jeder schreibt die Bild-URL direkt kann das Bild sehen, auch wenn die Person nicht im System angemeldet ist.

http://www.somedomainname.net/images/users/userImage.jpg 

Meine Frage: ist es möglich, Bilder (die oben genannte URL Beispiel) aus der Öffentlichkeit, in anderem Wort zu schützen, wenn eine URL des Bildes an einer Person senden, das einzelne Mitglied sein muss und einloggen in der Lage sein, das Bild zu sehen.

Ist das möglich und wie?

+0

Haben Sie versucht, eine Route zum Schutz des Bildpfads einzurichten? – haakym

+0

nein, aber ich werde versuchen, die folgende Antwort und lassen Sie wissen –

+0

@ Haakym, es das Beispiel unten für mich gearbeitet. Du hast recht, es ist in der Route. –

Antwort

23

Es ist möglich, Bilder von öffentlichen Ansicht in Laravel 5.x-Ordner zu schützen.

  • erstellen images Ordner unter storage Ordner (I storage Ordner gewählt, weil sie die Genehmigung schreiben schon, dass ich verwenden können, wenn ich Bilder hochladen, um es) in Laravel wie storage/app/images.

  • Verschieben Sie die Bilder, die Sie vor dem öffentlichen Ordner schützen möchten, in den neu erstellten Ordner images. Sie könnten auch einen anderen Ort wählen, um den Ordner images zu erstellen, aber nicht im öffentlichen Ordner, sondern mit der Laravel-Ordnerstruktur, aber immer noch ein Beispiel für einen logischen Speicherort, nicht im Controller-Ordner. Als nächstes müssen Sie einen Routen- und Bildcontroller erstellen.

Route erstellen

Route::get('images/users/{user_id}/{slug}', [ 
    'as'   => 'images.show', 
    'uses'  => '[email protected]', 
    'middleware' => 'auth', 
]); 

Die Route wird alle Bildanforderung Zugriff auf Authentifizierungsseite weiterleiten, wenn Person nicht angemeldet ist.

erstellen ImagesController

class ImagesController extends Controller { 

    public function show($user_id, $slug) 
    { 
     $storagePath = storage_path('app/images/users/' . $user_id . '/' . $slug); 
     return Image::make($storagePath)->response(); 
    } 
} 

Sie können Ihren Speicherpfad und die Datei-/Ordnerstruktur ändern, wie Sie Ihre Anforderung erfüllen möchten. Dies dient nur dazu, zu demonstrieren, wie ich es gemacht habe und wie es funktioniert.

Sie können auch eine Bedingung hinzufügen, um die Bilder nur für bestimmte Mitglieder im Controller anzuzeigen.

Es ist auch möglich, den Dateinamen mit Dateinamen, Zeitstempel und anderen Variablen zusätzlich zu hashen.


Zusatz: einige gefragt, ob diese Methode als Alternative zum öffentlichen Ordner-Upload verwendet werden kann, ja es ist möglich, aber es ist nicht die Praxis empfohlen, da in diesen answer erläutert. Daher kann die gleiche Methode auch zum Hochladen von Bildern im Speicherpfad verwendet werden, auch wenn Sie sie nicht schützen möchten. Folgen Sie einfach demselben Prozess, aber entfernen Sie 'middleware' => 'auth',.Auf diese Weise geben Sie keine 777-Berechtigung in Ihrem öffentlichen Ordner und verfügen weiterhin über eine sichere Upload-Umgebung. Dasselbe, das answer erwähnt wird, erklären auch, wie man diese Methode mit aus Authentifizierung verwendet, wenn jemand es verwenden oder alternative Lösung auch geben würde.

+0

nicht wirklich für das normale Hochladen von Bildern ohne Schutz empfohlen, da die Leistung wird viel schlechter sein als Apache \ nginx Handhabung Serving die Bilder –

+0

@ AmirBar, was ist Ihre alternative Lösung? –

+0

für normales Hochladen von Bildern, die nicht geschützt werden müssen, dann in den öffentlichen Ordner hochladen und nginx damit umgehen lassen. –

0

Ich habe dies nicht wirklich versucht, aber ich fand Nginx auth_request Modul, mit dem Sie die Authentifizierung von Laravel überprüfen können, aber immer noch die Datei mit Nginx senden.

Es sendet eine interne Anfrage an gegebene URL und überprüft den http-Code für Erfolg (2xx) oder Fehler (4xx) und bei Erfolg, lässt der Benutzer die Datei herunterladen.

Bearbeiten: Eine andere Option ist etwas, was ich versucht habe und es schien gut zu funktionieren. Sie können X-Accel-Redirect -header verwenden, um die Datei von Nginx bereitzustellen. Die Anfrage läuft über PHP, aber anstatt die gesamte Datei zu senden, sendet sie den Speicherort der Datei an Nginx, der sie dann an den Client liefert.