Apache запретить доступ к файлам, Laravel

110
30 ноября 2020, 15:30

Всем привет. По пути storage/5/sas24s15.png лежит картинка. Эта картинка принадлежит конкретному пользователю, только он может получить к ней доступ. Мой возможный вариант реализации: в таблице БД хранить путь к файла, символическую ссылку и оригинально название.

Пользователь переходит по пути storage/5/ajs5, проверяются права и перенаправляет на нужную ссылку. Имя файла - рандомный набор символов длиной от 30 до 250 символов. Но, вижу недочёт, вдруг кто-то поделится абсолютной ссылкой, то другой сможет скачать этот файл без проблем. Да, конечно можно после получения одной ссылки сразу же менять запись в БД.

Как настроить Apache под Laravel ?(перенаправлять на нужный контроллер, который решает отдать файл или нет). Или же использовать мой вариант?

Answer 1

1) Картинки загружать не в public директорию.

2) Сделать контроллер - который, например, при урле: http://example.com/image/123 берет 123 (тобишь наш id для поиска по базе) и ищет картину.

3) Если картинка найдена - смотрим кто её запрашивает (по кукам, сессиям или как вы там идентифицируете пользователя) если тот у кого есть права на просмотр, то отображаем картинку, например так:

$file = "<Путь к картинке>";
header("Content-type: image/jpeg");
readfile($file);
exit();

И будет вывод как настоящей картинки. Таким способом вы сохраняете путь к картинке закрытым и перед тем как показать изображение обрабатываете php скриптом

Answer 2

Вкратце так:

Маршрут -

Route::get('files/{filename}', 'HomeController@getFile');

Контроллер -

class HomeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
    public function getFile($filename)
    {
        // проверяем может ли \Auth::user() скачивать файл $filename;
       if( ... ) {
           return response()->download(storage_path('files/'.$filename), null, [], null); 
       } else {
           abort(403);
       }
    }
}

Файлы мы храним соответственно в /storage/files куда публичного доступа нет.

READ ALSO
Проблема кодировки строки

Проблема кодировки строки

Как превратить такую строку в читабельную?

117
Как сравнить текущее время с заданным php?

Как сравнить текущее время с заданным php?

Написал следующий код, но - пустота

213
парсинг xml файла с ftp сервера

парсинг xml файла с ftp сервера

I can not implement parsing from ftp, and everything works with the folder on the phone

147
Как удалить ведущий &ldquo;0&rdquo; из строки?

Как удалить ведущий “0” из строки?

У меня есть строка которая соединяет 2 строки в себя, мне нужно если 1-цифра 0 то удалить ее из строкиКак такое можно сделать?

102