Система контроля доступа позволяет:
- разграничить доступ к файлам и папкам как автрризованным пользователям, так и неавторизованным
- два типа работы:
- 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() должен возвращать массив (как в файле конфигурации), не объект !!!
Войдите через социальную сеть
Или войдите в свой аккаунт
Забыли пароль? | Регистрация