Как ограничить доступ пользователей к их собственным директориям в alexusmai/Laravel-File-Manager?

Вопрос или проблема

Я разрабатываю систему управления файлами на 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. Убедитесь, что вы протестировали вход и доступ пользователей, чтобы гарантировать безопасность файловой системы. Помните, что корректная настройка прав доступа и путей к директориям — это ключевой момент для предоставления безопасного и функционального опыта работы с файлами.

Оцените материал
Добавить комментарий

Капча загружается...