Laravel 5.0をインストールし、認証を行いました。すべてうまくいきます。
私のWebサイトは、認証されたメンバーのみが利用できます。内部のコンテンツは認証されたメンバーに対してのみ保護されていますが、サイト内の画像はパブリックビューに対して保護されていません。
ユーザーがシステムにログインしていなくても、画像URLを直接書き込んだ人は誰でも画像を見ることができます。
http://www.somedomainname.net/images/users/userImage.jpg
私の質問:画像(上記のURLの例)をパブリックビューから保護できますか?つまり、画像のURLが誰かに送信される場合、その個人はメンバーであり、ログインできる必要があります画像を見てください。
それは可能ですか?
私は実際にこれを試していませんが、Nginxを見つけました auth_request
Laravelからの認証を確認しながら、Nginxを使用してファイルを送信できるモジュール。
これは、指定されたURLに内部リクエストを送信し、httpコードで成功(2xx)または失敗(4xx)をチェックし、成功すると、ユーザーがファイルをダウンロードできるようにします。
編集:別のオプションは私が試したものであり、それはうまく機能しているようです。 X-Accel-Redirect
-Nginxからファイルを提供するヘッダー。リクエストはPHPを通過しますが、ファイル全体を送信するのではなく、ファイルの場所をNginxに送信するだけで、クライアントに提供します。
以前のプロジェクトでは、次のようにしてアップロードを保護しました。
作成ストレージディスク:
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}', 'MiscController@licenceFileShow');
私があなたを理解しているなら、それは!
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');