2016-05-16 11 views
9

Ich habe öffentliche/Asset/Media/OrdnerSicherer Asset-/Medienordner durch Auth-Controller? Laravel 5.2

Ich kann auf diese Datei öffentlich zugreifen wie unten.

http://localhost/myapp/public/Asset/Media/1/phpunit.xml 

In ähnlicher Weise gibt es andere Ordner im Asset/Media-Ordner, die gerade erstellt werden.

Es gibt viele Dateien auch in dieser Unter Ordner und sind auch im Asset/Medien Ordner

Gibt es eine Möglichkeit, so dass, wenn ich versuche, eine Datei für den Zugriff auf im Asset/Medien-Ordner oder Dateien vorhanden im Unterordner des Ordners Asset/Media sollte ich zur Anmeldeseite umgeleitet werden, weil die Authentifizierung nicht erfolgt?

Ich meinte, kann ich Auth Middleware verwenden, um diesen Ordner zu sichern? Wenn ja, ist es ein gültiger Ansatz, wenn wir von einer Android App aus auf die Dateien zugreifen müssen?

Antwort

1

Mein Beispiel-URL ist hier:

http://domainname.com/storage/Asset/Media/1/filename.txt

Meine Route

Route::get('/storage/Asset/Media/{ID}/{file}', array(
    'as' => 'Files', 
    'uses' => 'User\Account\Media\[email protected]', 
)); 

Controller Aktion Methode

public function DownloadMedia($ID) { 
    $headers = array(
     'Content-Type'  => 'application/octet-stream', 
     'Content-Disposition' => 'attachment; filename=somefile.txt"' 
    ); 

    return response()->download(base_path("storage/Asset/Media/1/somefile.txt")); 
} 

Hier wichtige Sache ist, kann ich application/octet-stream verwenden, um jeden Dateityp herunterzuladen.

1

Wenn Sie Dateien sichern möchten, müssen sie durch Laravel gehen. Der Zugriff auf die Datei erfolgt (über den vollständigen Pfad) nicht über Laravel. Sie können dies erreichen, indem eine Route zu erstellen:

Route::group(['middleware' => ['auth']], function() { 
    Route::get('/secure/file/{file_name}', '[email protected]'); 
} 

Erstellen Sie dann einen Controller, um die Datei zugreifen, so dass Sie Auth verwenden können, um die Erlaubnis für den Zugriff zu überprüfen. Es bedeutet auch, dass Sie die Datei in einer unzugänglichen Stelle setzen sollen und das Laravel Dateisystem verwenden, um die Datei für den Zugriff auf PHP:

class FileController extends Controller { 
    public function file() 
    { 
     return Storage::get('path/to/phpunit.xml'); 
    } 
} 
+0

Ist es ein gültiger Ansatz, wenn wir von einer Android App aus auf die Dateien zugreifen müssen? – Pankaj

+0

Ich sehe kein Problem mit dem Zugriff auf Dateien über Android App, aber dieser Ansatz könnte mehr Ressourcen verbrauchen als gewünscht, wenn Sie große/viele Dateien mit diesem Ansatz bereitstellen. –

1

Verwenden Sie die Route bekommen helfen könnten:

wird
Route::get('/myapp/public/Asset/Media/{id}', function ($id) { 
    if (Auth::guest()){ 
     return Redirect::guest('login'); 
    }else{ 
     $img="/myapp/public/Asset/Media/".$id; 
      if(File::exists($img)) { 
     return Response::make($img, 200, array('content-type' => 'image/jpg')); 
      }else{ 
       return false; 
      } 
})->where('id', '.+'); 
+0

Ist es ein gültiger Ansatz, wenn wir von einer Android App aus auf die Dateien zugreifen müssen? – Pankaj

+0

Dies funktioniert überhaupt nicht. Ich kann die Datei weiterhin als anonymen Benutzer anzeigen – Pankaj

0

Datei in den öffentlichen Ordner Aufgrund der von Laravel verwendeten Rewrite-Regeln ist Laravel für jeden zugänglich. Laravel wird nicht einmal aufgerufen, wenn jemand auf eine Datei in der Öffentlichkeit zugreift er.

Also, Sie müssen Ihre eingeschränkten Dateien woanders, vielleicht in Speicherordner, aber letztlich ist es egal.

Nachdem Sie alle Ihre Asset/Media-Ordner in den Speicherordner und aktualisieren Sie Ihren Code, die Ihren Ordner im laufenden Betrieb erstellen (How storage works).

erstellen FileController:

PHP

class FileController extends Controller { 
    public function __construct() { 
     $this->middleware('auth'); 
    } 

    public function downloadFile($filename) { 
     return response()->download(storage_path($filename), null, [], null); 
    } 
} 

Das configure diese Route:

Route::get('file/{filename}', '[email protected]')->where('filename', '^[^/]+$'); 

Das ist es, jetzt nur noch Ihre authentifizierten Benutzer der Lage wäre, Asset-Dateien zum Download thanx zur Middleware-Authentifizierung, das wird auch für Android-App funktionieren.