webentwicklung-frage-antwort-db.com.de

So schützen Sie das Bild vor dem Zugriff durch die Öffentlichkeit in Laravel 5?

Ich habe Laravel 5.0 installiert und die Authentifizierung durchgeführt. Alles funktioniert gut.

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 Öffentlichkeit zugänglich.

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

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

Meine Frage: Ist es möglich, Bilder (obiges URL-Beispiel) vor der öffentlichen Ansicht zu schützen, in anderen Worten, wenn eine URL des Bildes an eine Person gesendet wird, muss die Person Mitglied sein und sich anmelden, um das zu sehen Bild.

Ist das möglich und wie?

17
user4980957

Es ist möglich, Bilder aus dem Ordner public view im Ordner Laravel 5.x zu schützen.

  • Erstellen Sie den Ordner images unter dem Ordner storage (Ich habe den Ordner storage gewählt, da er bereits Schreibrechte besitzt, die ich beim Hochladen von Bildern verwenden kann.) In Laravel wie storage/app/images

  • Verschieben Sie die Bilder, die Sie aus dem Öffentlichen Ordner schützen möchten, in den neu erstellten Ordner images. Sie können auch einen anderen Speicherort auswählen, um einen images-Ordner zu erstellen, jedoch nicht innerhalb des öffentlichen Ordners, sondern in der Ordnerstruktur Laravel, jedoch immer noch ein logisches Speicherort-Beispiel, das sich nicht im Controller-Ordner befindet. 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 leitet den gesamten Bildanforderungszugriff an die Authentifizierungsseite weiter, wenn die Person nicht angemeldet ist.

ImagesController erstellen

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 nach Ihren Wünschen ändern. Dies soll nur zeigen, wie ich es getan 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 zusätzlich mit Dateinamen, Zeitstempel und anderen Variablen zu kennzeichnen.


Zusatz: Einige wurden gefragt, ob diese Methode als Alternative zum Hochladen von öffentlichen Ordnern verwendet werden kann. JA ist möglich, es wird jedoch nicht empfohlen, die in dieser Antwort erläuterten Vorgehensweise zu verwenden. Die gleiche Methode kann auch verwendet werden, um Bilder in den Speicherpfad hochzuladen, selbst wenn Sie sie nicht schützen möchten. Folgen Sie einfach dem gleichen Vorgang, entfernen Sie jedoch 'middleware' => 'auth',. Auf diese Weise erteilen Sie keine 777-Berechtigung in Ihrem öffentlichen Ordner und haben trotzdem eine sichere Umgebung zum Hochladen. Dieselbe Antwort erklärt auch, wie diese Methode ohne Authentifizierung verwendet wird, falls jemand sie verwenden würde oder eine alternative Lösung geben würde.

In einem früheren Projekt habe ich die Uploads folgendermaßen geschützt:

Erstellt Speicherplatte:

config/filesystems.php
'myDisk' => [
        'driver' => 'local',
        'root' => storage_path('app/uploads'),
        'url' => env('APP_URL') . '/storage',
        'visibility' => 'private',
    ],

Dadurch werden die Dateien in \storage\app\uploads\ Hochgeladen, das für public Viewing nicht verfügbar ist.

So speichern Sie Dateien auf Ihrem Controller:

Storage::disk('myDisk')->put('/ANY FOLDER NAME/' . $file, $data);

Damit Benutzer die Dateien anzeigen und die Uploads vor nicht autorisiertem Zugriff schützen können. Überprüfen Sie zunächst, ob die Datei vorhanden auf der Festplatte vorhanden ist:

public function returnFile($file)
{
    //This method will look for the file and get it from drive
    $path = storage_path('app/uploads/ANY FOLDER NAME/' . $file);
    try {
        $file = File::get($path);
        $type = File::mimeType($path);
        $response = Response::make($file, 200);
        $response->header("Content-Type", $type);
        return $response;
    } catch (FileNotFoundException $exception) {
        abort(404);
    }
}

Serve die Datei, wenn der Benutzer den richtigen Zugriff hat:

 public function licenceFileShow($file)
{
    /**
     *Make sure the @param $file has a dot
     * Then check if the user has Admin Role. If true serve else
     */
    if (strpos($file, '.') !== false) {
        if (Auth::user()->hasAnyRole(['Admin'])) {
            /** Serve the file for the Admin*/
            return $this->returnFile($file);
        } else {
            /**Logic to check if the request is from file owner**/
            return $this->returnFile($file);
        }
    } else {
//Invalid file name given
        return redirect()->route('home');
    }
}

Endlich auf Web.php Routen:

Route::get('uploads/user-files/{filename}', '[email protected]');
1

Ich habe das eigentlich nicht ausprobiert, aber ich habe ein Nginx auth_request Modul gefunden, mit dem Sie die Authentifizierung von Laravel überprüfen können, aber die Datei trotzdem mit Nginx senden.

Es sendet eine interne Anforderung an die angegebene URL und überprüft den http-Code auf Erfolg (2xx) oder Fehler (4xx). Bei Erfolg kann der Benutzer die Datei herunterladen.

Edit: Eine andere Option habe ich ausprobiert und es schien gut zu funktionieren. Sie können X-Accel-Redirect -header verwenden, um die Datei von Nginx aus zu liefern. Die Anforderung wird über PHP gesendet, aber anstatt die gesamte Datei durchzuschicken, wird lediglich der Dateispeicherort an Nginx gesendet, der sie dann an den Client weiterleitet.

0
Dilaz