2017-03-06 37 views
3

我使用Laravel(ocotber CMS),並使用Spatie URL Signer包來保護我的文件用有限的生命鏈接開發我的項目有限的生命週期鏈接保護的文件。我上傳我的文件由.htaccess文件中的黑名單保護目錄。通過生成使用Spatie URL簽名者

我的.htaccess: RewriteRule ^storage/app/uploads/protected/.* index.php [L,NC]

我的文件上傳至:生成的 UrlSigner::sign('http://localhost:8888/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf');

:生成與到期日的鏈接 /storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf

代碼鏈接看起來像: http://localhost:8888/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf?expires=1488905432&signature=fd82b06725096b8e6c43221a9616e420

另外我還添加了使用包的中間件來保護鏈接的路由處理代碼。 Route::get('protected-route', ['middleware' => 'signedurl', function() { return 'Hello secret world!'; }]);

但是,生成的鏈接不可用於下載。 我不懷疑這是因爲我有一個受保護的文件夾中的文件。當我嘗試使用公用文件夾時,該文件可用。但那麼我的文件就沒有保護。因爲你可以看到上面的生成的鏈接中包含的路徑,我的文件夾中。

回答

1

既然你處理私人文件,它通常是一個更好的主意,不要讓文件系統來處理這些事情。相反,讓Laravel做,所以你可以做你需要的所有檢查,你永遠不會有暴露的實際文件:

路線:

// set up a route group with your signedurl middleware 
Route::group(['middleware' => 'signedurl'], function() { 
    // create a new route which references a controller 
    // the {path} is the location of the file 
    // so your URLs would look something like 
    // http://localhost:8888/media/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf 
    Route::get('media/{path}', '[email protected]'); 
    // you can also do some validation using 
    // ->where('path', '.*?'); 
}); 

然後在您的新控制器:

class MediaController extends Controller 
{ 
    public function getPrivateFile(Request $request, $pathToFile) 
    { 
     // check if file exists 
     // if (file_exists) { 
     //  # code... 
     // } 
     return response()->download($pathToFile); 
    } 
} 

這樣你的文件可以保持私密,你可以運行你的中間件,你可以做任何額外的檢查,你需要在控制器中。