ساخت url های موقت در لاراول temporary Signed Route

ساخت url های موقت در لاراول temporary Signed Route

دسته : فریم ورک لاراول

کد محصول : 81

قیمت : رایگان

ساخت url های موقت در لاراول یا temporary Signed Route چه کاربردی دارد؟ آیا می می توانیم از url های خود محافظت کنیم؟ در لاراول چه تمهیداتی برای ایجاد آدرس های موقت و محافظت شده وجود دارد؟ گاهی برای شما هم اتفاق افتاده که نیاز داشته باشید فایل هایی را برای دانلود در سایت خود قرار دهید که دارای آدرس غیر مستقیم باشد یعنی یک آدرس موقت برای فایل مورد نظر تولید کنیم که تا زمانی خاص مثلا 24 ساعت اعتبار داشته باشد. laravel temporary Signed Route برای کمک به تولید این آدرس ها در اختیار ما قرار گرفته است. این یک بحث جالب هستش و به نظرم اول باید یک سری مقدمات رو برای شما توضیح بدم فرض کنید یک فایل apk...


ساخت url های موقت در لاراول یا temporary Signed Route چه کاربردی دارد؟ آیا می می توانیم از url های خود محافظت کنیم؟ در لاراول چه تمهیداتی برای ایجاد آدرس های موقت و محافظت شده وجود دارد؟

گاهی برای شما هم اتفاق افتاده که نیاز داشته باشید فایل هایی را برای دانلود در سایت خود قرار دهید که دارای آدرس غیر مستقیم باشد یعنی یک آدرس موقت برای فایل مورد نظر تولید کنیم که تا زمانی خاص مثلا 24 ساعت اعتبار داشته باشد. laravel temporary Signed Route برای کمک به تولید این آدرس ها در اختیار ما قرار گرفته است.

این یک بحث جالب هستش و به نظرم اول باید یک سری مقدمات رو برای شما توضیح بدم فرض کنید یک فایل apk برای دانلود روی سایتتون دارید و می خواهید یک url مستقیم براش تولید کنید خب برای ایجاد آدرس https://jobteam.ir/download_app در فایل web.php کد ذیل را ایجاد می کنیم

Route::get('download_app',function (){    
$file_path = base_path().'/public/uploads/jobteam.apk';
if (file_exists($file_path))     {
        return response()->download($file_path);    
}     else     {        
exit('فایل در حال به روز رسانی می باشد و فعلا قابل دانلود نمی باشد.');    
}});
 

 

این نوع تولید لینک همیشه در دسترس و ثابت می باشد و برای فایل های عمومی بسیار خب می باشد اما اگر یک فایل داشته باشیم که بخواهیم کاربران در صورت درخواست دانلود، مثلا تا 24 ساعت باید دانلود کنند چه کاری باید انجام بدیم؟  خب مسئله یکم پیچیده میشه اما ما در این مطالب از سری مطالب لاراول این موضوع رو آموزش خواهیم داد

ساخت یک آدرس موقت دانلود در لاراول یا laravel temporary Signed Route

مرحله اول افزودن middleware با عنوان signed هستش که از نسخه 5.6.12 به بعد به لاراول اضافه شده است پس مطابق کد ذیل این middleware رو به قسمت protected $routeMiddleware در فایل kernel.php اضافه می کنیم

 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,

 

برای اطمینان از افزودن شدن این middleware سعی کنید کش فریم ورک لاراول رو پاک کنید و از اول config کنید.

مرحله دوم ساخت یک کنترلر برای هدایت و ساخت آدرس موقت به اسم FileController می باشد می توانید با استفاده از دستور ذیل یک کنترلر ایجاد کنید

php artisan make:controller FileController

 

تابعی با عنوان getSignedUrl در این کنترلر ایجاد می کنیم که شناسه یک ردیف از جدول که اطلاعات فایل مورد نظر ما در آن ذخیره شده رو با پارامتر id به این تابع پاس میدیم

public function getSignedUrl($id)     {        
// add if user by this can download file        
return redirect(URL::temporarySignedRoute('UserDownloadFile',now()->addHours(1), ['id' => $id,'user' => Auth::user()->id])); }

 

دقت کنید ما از temporarySignedRoute برای ایجاد یک آدرس موقت استفاده می کنیم که اولین آرگومان نام مسیر اصلی فایل است دومین آرگومان زمان اعتبار این آدرس است و سومین آرگومان یک آرایه شامل شناسه فایل مورد نظر و شناسه کاربر درخواست دهنده این url می باشد. سپس ما تابع UserDownloadFile در این کنترلر ایجاد می کنیم

public function getFile($id)     {        
    $find=ProductFile::findOrFail($id); // اطلاعات مسیر ذخیره و ... رو از دیتابیس خوندیم        
    $file_path = base_path().'/public/upload/document/'.$find->link.'/'.$find->name_file;        
    if (file_exists($file_path))         {            
    return response()->download($file_path);        
    }         else         {            
    exit('فایل در حال به روز رسانی می باشد و فعلا قابل دانلود نمی باشد.');        
  }    
}

 

کد کامل این کنترلر به این صورت خواهد بود

 

namespace App\Http\Controllers\Visitor;
use App\ProductFile; // مدل حاوی اطلاعات فایل 
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\URL; // فراخوانی کلاس های ساخت آدرس موقت
class FileController extends Controller
{
    public function getSignedUrl($id)
    {
       // add if user by this can download file
        return redirect(URL::temporarySignedRoute('UserDownloadFile',now()->addHours(1), ['id' => $id,'user' => Auth::user()->id]));
    }
    public function getFile($id)
    {
        $find=ProductFile::findOrFail($id);
        $file_path = base_path().'/public/upload/document/'.$find->link.'/'.$find->name_file;
        if (file_exists($file_path))
        {
            return response()->download($file_path);
        }
        else
        {
            exit('فایل در حال به روز رسانی می باشد و فعلا قابل دانلود نمی باشد.');
        }
    }
}

 

حالا مسیرهای این متدها به صورت ذیل خواهد بود که من در این مسیرها middleware برای چک کردن لاگین کاربر auth رو هم اضافه کردم

Route::get('file/{id}','Visitor\FileController@getfile')->name('UserDownloadFile')->middleware(['signed','auth']);
Route::get('files/{id}','Visitor\FileController@getSignedUrl')->middleware('auth');

 

حالا برای دسترسی و دانلود این فایل ها در href لینک مورد نظر کد ذیل رو قرار می دهیم که متغیر id شناسه اطلاعات فایل مورد نظر ماست که در دیتابیس ذخیره شده است.

{{ url('files',['id' => $id]) }}

 

این کد آدرسی مثل https://jobteam.ir/files/31 در href لینک شما ایجاد خواهد کرد که با مراجعه به این مسیر یک مسیر موقت و هش شده برای شما ایجاد می شود که تا یک ساعت از زمان تولید فرصت دانلود فایل را خواهید داشت. مثال آدرس تولید شده موقت با لاراول

https://jobteam.ir/file/31?expires=1569690642&user=1&signature=00803b155666950e70def455c4d80482bfa9f7b6d7e8bbd70e40c9401f630f82

 

اگر این آدرس تغییر یا منقضی شود با پیغام Invalid signature 403 پاسخ خواهید گرفت. امیدوارم این آموزش برای تمام دوستداران فریم ورک لاراول جذاب و مفید باشد.

 

  • ساخت url های موقت در لاراول temporary Signed Route را با دوستان خود به اشتراک بگذارید.
  • سوالات خود را در بخش پرسش و پاسخ این مطلب ثبت کنید.
  • مطالب خود را در جاب تیم به اسم خود ثبت کنید ارسال مطلب


ثبت سوال/پاسخ
بهزاد میرزازاده
در مورد کاربر : همیشه سخت تلاش کردم و به موفقیت های خیلی زیادی رسیدم اما دلیل نشد که متوقف بشم من برای هر روز برنامه دارم و به امید موفقیت های بزرگتر قدم بر میدارم همیشه سخت ترین مسئله ها، ساده ترین راه حل رو دارند پس بهانه جویی نباید روش کار ما برنامه نویسان باشه!!! ما می توانیم آینده را تعیین کنیم
اشتراک گذاری این مطلب
{