28

Laravel 5.0をインストールし、認証を行いました。すべてがうまく機能しています。

私のウェブサイトは、認証されたメンバーのみが利用できます。内部のコンテンツは認証されたメンバーのみに保護されていますが、サイト内の画像はパブリック ビューに対して保護されていません。

システムにログインしていなくても、画像の URL を直接書き込むと、誰でも画像を見ることができます。

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

私の質問:画像 (上記の URL の例) をパブリック ビューから保護することは可能ですか? つまり、画像の URL が任意の人に送信された場合、その個人はメンバーであり、画像を表示できるようにログインする必要があります。

それは可能ですか?

4

5 に答える 5

35

Laravel 5.x フォルダー内のパブリック ビューからイメージを保護することができます。

  • Laravel のように、imagesフォルダーの下にフォルダーを作成しstorageます (フォルダーに画像をアップロードするときに使用できる書き込み権限が既にあるため、フォルダーを選択storagestorage/app/imagesしました) 。

  • 保護したい画像をパブリックフォルダーから新しく作成したimagesフォルダーに移動します。フォルダーを作成するために他の場所を選択することもできimagesますが、パブリックフォルダー内ではなく、Laravel フォルダー構造ではありますが、論理的な場所の例はコントローラーフォルダー内ではありません。次に、ルートとイメージ コントローラーを作成する必要があります。

ルートを作成

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

人がログインしていない場合、ルートはすべてのイメージ要求アクセスを認証ページに転送します。

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();
    }
}


編集(注)

Laravel 5.2以降をお使いの方向け。Laravel は、オーバーヘッドの少ないファイルを提供する新しいより良い方法を導入しています (この方法では、回答に記載されているようにファイルが再生成されません)。

ファイル応答

file メソッドを使用すると、ダウンロードを開始する代わりに、画像や PDF などのファイルをユーザーのブラウザに直接表示できます。このメソッドは、ファイルへのパスを最初の引数として受け取り、ヘッダーの配列を 2 番目の引数として受け取ります。

return response()->file($pathToFile);

return response()->file($pathToFile, $headers);

要件に合わせて、ストレージ パスとファイル/フォルダー構造を変更できます。

コントローラー内の特定のメンバーの画像のみを表示する条件を追加することもできます。

さらに、ファイル名、タイムスタンプ、その他の変数を使用してファイル名をハッシュすることもできます。


追加:この方法をパブリック フォルダーのアップロードの代わりに使用できるかどうかを尋ねる人もいました。はい、可能ですが、この回答で説明されているように、推奨される方法ではありません。したがって、同じ方法を使用して、画像を保護するつもりがない場合でも、ストレージ パスに画像をアップロードすることができます。同じプロセスに従って を削除して'middleware' => 'auth',ください。そうすれば、パブリック フォルダーに 777 のアクセス許可を与えなくても、安全なアップロード環境を維持できます。同じ言及された答えは、誰かがそれを使用したり、代替ソリューションを提供したりする場合に備えて、認証なしでこの方法を使用する方法も説明しています。

于 2015-06-06T11:46:05.697 に答える
0

public フォルダー内のすべてのファイルは、ブラウザーでアクセスできます。ファイル名と保存パスがわかれば、誰でも簡単にそのファイルを取得できます。

したがって、より良いオプションは、パブリックフォルダーの外にファイルを保存することです。/storage/app/private

次の手順を実行します。

  1. ルートを作成します (例: private/{file_name})

    Route::get('/private/{file_name}', [App\Http\Controllers\FileController::class, 'view'])->ミドルウェア(['auth'])->name('view.file' );

  2. ファイル パスを返す関数をコントローラーに作成します。コントローラーを作成するには、コマンドを実行しますphp artisan make:controller FileController

ビュー関数をFileControllerに貼り付けます

public function view($file)
    {
        $filePath = "notes/{$file}";
        
        if(Storage::exists($filePath)){
            return Storage::response($filePath);
        }
        abort(404);
    }

次に、use Illuminate\Support\Facades\Storage;FileController for Storageに貼り付けます

  1. そして、要件としてミドルウェア (ルートまたはコントローラー) を割り当てることを忘れないでください (例: auth)

そして今、そのミドルウェアにアクセスできる人だけが、と呼ばれるルート名を介してそのファイルにアクセスできますview.file

于 2022-02-17T07:03:23.380 に答える