Вопрос или проблема
Я разрабатываю систему управления файлами на Laravel, используя пакет alexusmai/laravel-file-manager. Моя цель – создать систему, аналогичную Google Drive, где пользователи смогут управлять своими собственными файлами. Для каждого пользователя я создаю уникальный каталог во время регистрации и сохраняю имя каталога в поле base_directory_name в таблице пользователей. Я хочу убедиться, что пользователи могут получить доступ только к содержимому своего собственного каталога.
В конфигурационном файле пакета я установил корневой путь и использую middleware для динамического изменения настроек файловой системы для каждого пользователя. Однако, когда система работает, пользователи все еще могут получить доступ ко всему корневому каталогу.
config/filesystems.php
'disks' => [
'private' => [
'driver' => 'local',
'root' => storage_path('app/private'),
'url' => env('APP_URL').'/storage',
'visibility' => 'private',
'throw' => false,
],
config/file-manager.php
/**
* Список имен дисков, которые мы хотим использовать
* (из config/filesystems)
*/
'diskList' => ['private'],
мое middleware:
public function handle(Request $request, Closure $next): Response
{
if (Auth::guard("user")->check()) {
$userDirectory = storage_path("app/private/"). Auth::guard("user")->user()->base_directory_name;
Config::set('filesystems.disks.private.root', $userDirectory);
//dd(Config::get('filesystems.disks.private.root'));
}
return $next($request);
}
Заметки:
- Если я вручную изменю конфигурационный файл, права доступа работают как ожидалось, и пользователи могут видеть только свои собственные файлы.
- После применения middleware я использовал Config::get, чтобы проверить настройки, и могу подтвердить, что изменения конфигурации происходят динамически во время выполнения, как и планировалось. Однако права доступа к файлам все еще не применяются корректно.
Может кто-то подсказать, как правильно обеспечить динамический доступ к каталогам для каждого пользователя? Не хватает ли мне чего-то в настройках конфигурации или middleware?
Буду признателен за любую помощь!
Ответ или решение
Для успешной реализации системы управления файлами в Laravel с использованием пакета alexusmai/laravel-file-manager и ограничения доступа пользователей к их собственным директориям, вам потребуется внести несколько изменений в вашу конфигурацию и middleware.
Шаг 1: Настройка файловой системы
Убедитесь, что в файле config/filesystems.php
ваша конфигурация для диска 'private'
настроена правильно. Вы уже сделали это, указав путь к директории, а также другие необходимые параметры:
'disks' => [
'private' => [
'driver' => 'local',
'root' => storage_path('app/private'),
'url' => env('APP_URL').'/storage',
'visibility' => 'private',
'throw' => false,
],
],
Шаг 2: Модификация конфигурации файла-менеджера
Как вы указали, в файле config/file-manager.php
у вас уже есть список дисков:
'diskList' => ['private'],
Эта конфигурация позволяет использовать только указанный диск, что правильно.
Шаг 3: Middleware для динамических изменений
Ваше middleware, настроенное для изменения пути к директории пользователя, выполнено корректно. Однако, следует учесть, что Laravel загружает конфигурацию файловой системы только один раз при загрузке приложения, и любые изменения, зробленные с помощью Config::set
, не могут влиять на уже открытые соединения.
Для решения этой проблемы вы можете использовать Laravel локальные хранилища или создать динамическую файловую систему для каждого запроса. Приведем пример, как правильно реализовать middleware:
public function handle(Request $request, Closure $next): Response
{
if (Auth::guard("user")->check()) {
$user = Auth::guard("user")->user();
$userDirectory = storage_path("app/private/") . $user->base_directory_name;
Config::set('filesystems.disks.private.root', $userDirectory);
// Устанавливаем текущую файловую систему для использования пользователем
$filesystem = new \Illuminate\Filesystem\FilesystemAdapter(app('filesystem')->disk('private')->getDriver());
// Устанавливаем сессию пользователя с необходимым адаптером
session(['current_filesystem' => $filesystem]);
}
return $next($request);
}
Шаг 4: Проверка занятости ресурсов
Чтобы убедиться, что доступ к файлам пользователя действует правильно, вы можете проверить, какие файлы и директории они могут видеть при помощи адаптера. Убедитесь, что вы используете адаптер файловой системы для выполнения операций файлового менеджера, установив адаптер из сеанса в методах вашего контроллера или вообще в вашей системе.
Шаг 5: Внедрение логики в контроллер
Пример того, как использовать адаптер из сессии в контроллере, может выглядеть так:
public function index()
{
$filesystem = session('current_filesystem');
if ($filesystem) {
$files = $filesystem->files(); // Это вернет файлы из специально установленной директории.
return view('your.view', compact('files'));
}
return redirect()->route('your.route');
}
Заключение
Эти изменения должны обеспечить правильное ограничение доступа пользователей к их собственным директориям при использовании пакета alexusmai/laravel-file-manager
. Убедитесь, что вы протестировали вход и доступ пользователей, чтобы гарантировать безопасность файловой системы. Помните, что корректная настройка прав доступа и путей к директориям — это ключевой момент для предоставления безопасного и функционального опыта работы с файлами.