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






Храните все файлы в папках, недоступных для любого пользователя, чтобы предотвратить угадывание URL-адресов.
Ваш код будет отвечать за проверку того, владеет ли пользователь файлом. Как только пользователь очищен, вы перемещаете файл во временный файл, доступный для всех:
Storage::copy('restricted_folder/file.jpg', 'public_folder/random_name.jpg');
Затем вы возвращаете ответ, который заставит пользователя загрузить файл и удалить временный файл после запроса:
return response()->download('public_folder/random_name.jpg','file.jpg')->deleteFileAfterSend();
Перемещение файла с последующим его удалением после загрузки будет означать, что файл будет навсегда утерян после однократной загрузки. Наверное, не идеально. return response()->download('restricted_folder/file.jpg') будет работать нормально, без всяких движений, стирания, причитания и скрежета зубов.
Вы правы, я хотел скопировать файл, спасибо. Но я считаю, что вы не сможете скачать файл из папки с ограниченным доступом.
Можно с response()->download(). Он передает файл через Laravel.
Спасибо, я не знал об этом.
Ответ здесь немного зависит от безопасности как, что все это должно быть.
Вы можете сгенерировать длинное случайное имя файла для файла при его загрузке. Их сложно угадать, как и достаточно надежный пароль, и в большинстве случаев они помогут.
Laravel действительно делает это изначально, если вы используете метод store():
$path = $request->file('avatar')->store('avatars');
Если вам нужна более высокая степень безопасности, вы можете хранить загруженные файлы в закрытом месте. Затем добавьте маршрут (например, download/{id}), пусть этот маршрут проверяет права пользователя для файла, о котором идет речь, и передает файл браузеру, если он авторизован:
return Storage::download('path/to/the.file');
Storage::download проксирует файл через Laravel, поэтому это работает даже с файлами, не хранящимися в общей папке.
Создайте связь между файлами и пользователями, затем обслуживайте только двоичные файлы
response()->download('/path/to/file'), гдеpath/to/file- это безопасное место в вашей файловой системе. Пример обслуживания двоичных файлов: stackoverflow.com/a/53145223/2797224