logo

4. Контроль доступа

Система контроля доступа позволяет:

  • разграничить доступ к файлам и папкам как автрризованным пользователям, так и неавторизованным
  • два типа работы:
    • BlackList - разрешать все, что не запрещено правилами ACL
    • WhiteList - запретить все, что не разрешено правилами ACL
  • Возможность использования различных хранилищ для правил (стандартно это файл настроек, массив, также есть пример реализация для использования БД)
  • можно не показывать файлы и папки, к которым нет доступа

Пример настройки:

- есть диск 'images' для папки /public/images  (/config/filesystems.php)

'disks' => [

        'images' => [
            'driver' => 'local',
            'root'   => public_path('images'),
            'url'    => '/images/',
        ],
]

- примерная структура папок на этом диске:

/                  // disk root folder
|-- nature         // folder
|-- cars           // folder
|-- icons
|-- image1.jpg     // file
|-- image2.jpg
|-- avatar.png

- пример настроек в файле конфигурации файлового менеджера:

'diskList'  => ['images'],

'aclStrategy'   => 'blacklist',

// теперь это черный список (blacklist)
'aclRules'      => [
       // null - для не авторизованных пользователей
        null => [
            ['disk' => 'images', 'path' => 'nature', 'access' => 0],   // гости не имеют доступа
            ['disk' => 'images', 'path' => 'icons', 'access' => 1],    // гости могут только читать
            ['disk' => 'images', 'path' => 'icons/*', 'access' => 1],  // гости могут только читать все файлы и папки в этой паке
            ['disk' => 'images', 'path' => 'image*.jpg', 'access' => 0], // нет доступа ко всем картинкам с именем image*.jpg
            ['disk' => 'images', 'path' => 'avatar.png', 'access' => 1], // только чтение файла avatar.png

        ],
        // правила для юзера с ID = 1
        1 => [
            ['disk' => 'images', 'path' => 'cars', 'access' => 0],        // нет доступа
            ['disk' => 'public', 'path' => 'image*.jpg', 'access' => 1],  // только чтение
        ],
    ],

- если есть два правила, для одного и того же path, то сработает первое найденное!

- если используете aclStrategy = whitelist, то не забывайте, что запрещено все, что не разрешено в правилах, то есть корневая директория диска так же окажется закрыта !!! Чтоб ее открыть добавьте правило:

['disk' => 'local', 'path' => '/', 'access' => 2],

ИЛИ

['disk' => 'local', 'path' => '/', 'access' => 1],

 

Также можно хранить правила в БД, я сделал пример, котрый можно использовать, если он вам подходит. 

Опубликовать миграцию:

php artisan vendor:publish --tag=fm-migrations

Теперь примените миграцию, и поменяйте в настройках файлового менеджера репозиторий:

/**
 * ACL rules repository
 *
 * default - config file(ConfigACLRepository)
 */
'aclRepository' => \Alexusmai\LaravelFileManager\ACLService\DBACLRepository::class,

Теперь вам нужно заполнить таблицу правил, это уже делаете как вам удобно и нужно.

Если вам не подходит стандартный репозиторий, вы можете написать свой, и подключить его в настройках файлового менеджера.

Например в паке /app/HTTP создаем класс:

<?php

namespace App\Http;

use Alexusmai\LaravelFileManager\ACLService\ACLRepository;

class MyACLRepository implements ACLRepository
{
    /**
     * Get user ID
     *
     * @return mixed
     */
    public function getUserID()
    {
        return \Auth::id();
    }

    /**
     * Get ACL rules list for user
     *
     * @return array
     */
    public function getRules(): array
    {
        return \DB::table('acl_rules')
            ->where('user_id', $this->getUserID())
            ->get(['disk', 'path', 'access'])
            ->map(function ($item) {
                return get_object_vars($item);
            })
            ->all();
    }
}

- в файле конфигурации(/config/file-manager) меняем репозиторий на только что созданный:

'aclRepository' => \App\Http\MyACLRepository::class,

Предупреждение!!! метод getRules() должен возвращать массив (как в файле конфигурации), не объект !!!

Комментарии