web-dev-qa-db-ja.com

Laravel 5でパブリックビューから画像を保護する方法は?

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

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

ユーザーがシステムにログインしていなくても、画像URLを直接書き込んだ人は誰でも画像を見ることができます。

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

私の質問:画像(上記のURLの例)をパブリックビューから保護できますか?つまり、画像のURLが誰かに送信される場合、その個人はメンバーであり、ログインできる必要があります画像を見てください。

それは可能ですか?

21
user4980957

私は実際にこれを試していませんが、Nginxを見つけました auth_request Laravelからの認証を確認しながら、Nginxを使用してファイルを送信できるモジュール。

これは、指定されたURLに内部リクエストを送信し、httpコードで成功(2xx)または失敗(4xx)をチェックし、成功すると、ユーザーがファイルをダウンロードできるようにします。

編集:別のオプションは私が試したものであり、それはうまく機能しているようです。 X-Accel-Redirect -Nginxからファイルを提供するヘッダー。リクエストはPHPを通過しますが、ファイル全体を送信するのではなく、ファイルの場所をNginxに送信するだけで、クライアントに提供します。

2
Dilaz

以前のプロジェクトでは、次のようにしてアップロードを保護しました。

作成ストレージディスク

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

これにより、ファイルは\storage\app\uploads\にアップロードされますが、publicで表示することはできません。

コントローラにファイルを保存するには:

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

ユーザーがファイルを表示し、アップロードをnauthorizedアクセスから保護するため。まず、ファイル存在がディスク上にあるかどうかを確認します。

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ユーザーが適切なアクセス権を持っている場合のファイル:

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

最後にWeb.phpルート:

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

私があなたを理解しているなら、それは!

 Route::post('/download/{id}', function(Request $request , $id){
  {

     if(\Auth::user()->id == $id) {
         return \Storage::download($request->f);
     } 
     else {
         \Session::flash('error' , 'Access  deny');
         return back();
     }
  }

 })->name('download')->middleware('auth:owner,admin,web');
0
Mohamed Amin