Как обезопасить папки Laravel Storage - PullRequest
0 голосов
/ 10 ноября 2018

В моем проекте я реализовал аутентификацию и ACL для моих контроллеров и маршрутов.У меня есть система загрузки файлов, доступная только в том случае, если пользователь вошел в систему.Это нормально работает.

Моя проблема с загруженными файлами.Пользователь может получить доступ к любому файлу, если у него есть URL файла.Как я могу реализовать аутентификацию для загруженных файлов?

Я пробовал с маршрутами, но при доступе к моему файлу через браузер файл отображается так, как будто у меня нет маршрута, перехватывающего этот URL.

У меня естьиспользовал этот код:

Route::get('/storage/document/3/4a15c1ab060be8f35.png', function () {
  return 'ok';
});

Как я могу реализовать аутентификацию в определенных папках на хранилище?Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Вы можете сослаться на мой ответ здесь . Процесс включает в себя создание нового диска хранения, который сохраняет файлы на /storage/app/ (не в общей папке), и проверку запроса перед передачей файла пользователю.

0 голосов
/ 10 ноября 2018

Если вы хотите ограничить доступ к файлам для каждого пользователя на основе какого-либо разрешения, вам нужно будет создать эту логику разрешения самостоятельно (StackOverflow не собирается делать вашу работу за вас), но ради ответа этот вопрос, давайте предположим, что у вас уже есть эта система разрешений, и для проверки, имеет ли пользователь доступ, наша функция - hasAccessToFile, которая в основном просто ищет информацию, основываясь на требованиях вашей бизнес-логики.

Вместо того, чтобы предоставлять все файлы публично, вы можете обслуживать отдельные файлы, вот очень краткий пример:

Route::get('files/{pathToFile}', function($pathToFile) {

    if (auth()->user()->hasAccessToFile($pathToFile)) {
        return response()->file($pathToFile);
    } else {
        return 'Nope, sorry bro, access denied!';
    }

});

См. Файл ответов Документация.

Если вам нужно обеспечить загрузку файлов, а не их обслуживание, аналогично:

Route::get('files/{pathToFile}', function($pathToFile) {

    if (auth()->user()->hasAccessToFile($pathToFile)) {
        return response()->download($pathToFile);
    } else {
        return 'Nope, sorry bro, access denied!';
    }

});

См. Загрузка файлов Документация.

...