在laravel的public目錄下有個res的目錄,想在使用者訪問裡面的圖片的時候評鑑是否有許可權,
但是使用者輸入地址會直接存取到這個檔案,不會經過auth中介軟體的評鑑,
例如:在public下的res目錄裡面放一個圖片,
路由:
Route::get('/res/{res}', ['middleware' => 'auth', 'uses' => 'TestController@res']);
訪問可以直接看到圖片,如何?只有登入過的使用者才可以看到圖片呢?
我看了一下我的百度盤裡面的圖片的連結,
是類似於這樣的
http://thumbnail0.baidupcs.com/thumbnail/e9be0226a22b8a1ad721032ac0338bb3?fid=4079835327-250528-565979844600151&time=1467727200&rt=yt&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-4mQdS41CM3TuSq6hpE8LIAn%2FiL0%3D&expires=2h&chkv=0&chkbd=0&chkpc=&dp-logid=4335431112578733428&dp-callid=0&size=c256_u256&quality=100
好像是給每個圖片生產一個hash值,然後根據路由和路由裡面的參數進行驗證,通過後根據hash返迴文件。
具體的實現原理,有哪位可以請教一下呢?
回複內容:
在laravel的public目錄下有個res的目錄,想在使用者訪問裡面的圖片的時候評鑑是否有許可權,
但是使用者輸入地址會直接存取到這個檔案,不會經過auth中介軟體的評鑑,
例如:在public下的res目錄裡面放一個圖片,
路由:
Route::get('/res/{res}', ['middleware' => 'auth', 'uses' => 'TestController@res']);
訪問可以直接看到圖片,如何?只有登入過的使用者才可以看到圖片呢?
我看了一下我的百度盤裡面的圖片的連結,
是類似於這樣的
http://thumbnail0.baidupcs.com/thumbnail/e9be0226a22b8a1ad721032ac0338bb3?fid=4079835327-250528-565979844600151&time=1467727200&rt=yt&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-4mQdS41CM3TuSq6hpE8LIAn%2FiL0%3D&expires=2h&chkv=0&chkbd=0&chkpc=&dp-logid=4335431112578733428&dp-callid=0&size=c256_u256&quality=100
好像是給每個圖片生產一個hash值,然後根據路由和路由裡面的參數進行驗證,通過後根據hash返迴文件。
具體的實現原理,有哪位可以請教一下呢?
laravel本身只處理/public/index.php這一個入口, 你說的圖片檔案不在index.php裡面,Laravel不管的;
除非你把圖片的訪問放在一個控制器裡面,比如 /Img/locaiton?user=xxx&name=iiii, 這樣訪問ImgController.php,你自己讀取圖片顯示出來就行了, 你自己加auth就OK(注意不要把圖片放在/public下面了,放在public同級目錄下)
public/裡面除了index.php 其他的檔案都是純靜態檔案,根本就不在Laravel路由裡面
至於百度網盤的hash參數什麼的 都是讀取檔案的地址和到期時間,你自己按自己的方式實現就可以,想要什麼自己加
用WebServer做rewrite,經過一個控制器php,在這個控制器中Auth:check。
需要控制許可權訪問的檔案,不應當放在 public 目錄下,而是 storage 目錄下,這樣外部根本不可能直接存取得到。
你可以通過實現一個控制器,在這裡面評鑑訪問者許可權,若是符合,則可以以你希望的形式通過 HTTP 的傳輸串流輸出圖片位元據。
Laravel 的(準確的說是 Symfony)已經提供了這種類型的 Response,可以翻閱文檔尋找相應的 API。
所有你已知的那種圖片許可權驗證和防盜鏈處理方式大多是如此。
以上。