#laravel-5.2 #user-roles #laravel-middleware
#laravel-5 #роли пользователей #laravel-промежуточное программное обеспечение
Вопрос:
Я нахожусь в процессе обновления приложения Laravel 4.2, которое я унаследовал, до Laravel 5.2. Приложение имеет несколько ролей для зарегистрированных пользователей, которые были обработаны с помощью фильтра before. Каждый контроллер имеет множество функций и ролей, разрешенных для этих функций:
public $actionFilter = [
'directories-create'=>['super','tsr'],
'directories-destroy'=>['super','tsr'],
'directories-edit'=>['super','tsr'],
'directories-directoryinfo'=>['super','tsr','admin'],
'directories-index'=>['super','tsr'],
'directories-store'=>['super','tsr'],
'directories-update'=>['super','tsr'],
];
затем в функции construct он вызывает два фильтра предшествования, которые были в Controller.php
public function __construct()
{
$this->beforeFilter('@filterAuthorization');
$this->beforeFilter('@rerouteSite');
}
Controller.php была общедоступная функция filterAuthorization, которая проверяла, имеет ли роль пользователя доступ к маршруту, и общедоступная функция rerouteSite, которая позволяла пользователю оставаться на одной странице, но переключаться между учетными записями (например, для представителя службы поддержки).
Я потратил немало времени на чтение руководства, поиск в Google и чтение различных руководств, но мне все еще неясно, как подключить мой массив ролей маршрута к промежуточному программному обеспечению auth. Документы Laravel предоставляют синтаксис, но не контекст, и примеры, которые я прочитал, либо используют другой подход, либо имеют другой вариант использования, отличный от моего.
Я попытался оставить функции фильтра в Controller.php и вызывать их подобным образом в конструкции:
public function __construct()
{
$this->middleware('@filterAuthorization');
$this->middleware('@rerouteSite');
}
Я получаю сообщение об ошибке: «Класс @filterAuthorization не существует»
Я попытался поместить эти функции в app Http Middleware Authenticate, но я получаю то же сообщение об ошибке: «Класс @filterAuthorization не существует»
Я следовал инструкциям в блоге Мэтта Стауффера здесь (https://mattstauffer.com/blog/laravel-5.0-middleware-filter-style /) и здесь (https://mattstauffer.com/blog/passing-parameters-to-middleware-in-laravel-5.1 /) и в сообщении Nwanze Franklin здесь (https://dev.to/franko4don/deep-dive-into-middlewares-in-laravel-doo ) следующим образом.
Создайте два новых файла промежуточного программного обеспечения с помощью Artisan
php artisan make:middleware FilterAuthorization
php artisan make:middleware RerouteSite
Отредактируйте новые файлы промежуточного программного обеспечения с функциями из старого Controller.php
Зарегистрируйте новое промежуточное программное обеспечение в App Http Kernel
protected $routeMiddleware = [
'filterauth' => IlluminateRoutingMiddlewareFilterAuthorization::class,
'reroutesite' => IlluminateRoutingMiddlewareRerouteSite::class,
];
Отредактируйте общедоступную функцию __contstruct() в контроллерах, чтобы не требовалась фильтрация
public function __construct()
{
$this->middleware('FilterAuthorization');
$this->middleware('RerouteSite');
}
Выполнить
composer dump-autoload
php artisan clear-compiled
php artisan optimize
и я все еще получаю ту же ошибку:
Класс FilterAuthorization не существует
Я уверен, что есть простой способ объединить это вместе, не переписывая всю систему авторизации ролей. Может ли кто-нибудь указать мне правильное направление?
Ответ №1:
Регистрация ядра должна указывать на правильные расположения файлов следующим образом:
'filterauth' => AppHttpMiddlewareFilterAuthorization::class,
'reroutesite' => AppHttpMiddlewareRerouteSite::class,
И при загрузке контроллера должны использоваться псевдонимы, а не имена классов:
public function __construct()
{
$this->middleware('filterauth');
$this->middleware('reroutesite');
}
Затем Laravel может найти пользовательское промежуточное программное обеспечение.