добавляю посредник проверки наличие пользователя доступа к определенному функционалу в приложении. То есть, доступ к модулю есть, но нужно проверить может ли пользователь в рамках этого модуля обращаться к определенному web роуту или api ендпоинту
This commit is contained in:
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Facades\UserContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Посредник проверки доступа пользовательской роли к роуту или ендпоинту
|
||||||
|
*/
|
||||||
|
class CheckUserPermission
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Handle an incoming request.
|
||||||
|
*
|
||||||
|
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||||
|
*/
|
||||||
|
public function handle(Request $request, Closure $next, string $requirement): Response
|
||||||
|
{
|
||||||
|
//Роли, которым доступен функционал
|
||||||
|
$accessRoles = explode(';', $requirement);
|
||||||
|
$userPermissions = UserContext::getUserAppPermissions();
|
||||||
|
//Всем роутам модуля добавляем префикс, поэтому можем ориентироваться на него, чтобы получить имя модуля, откуда пришел запрос
|
||||||
|
$moduleName = explode('/', $request->route()->getPrefix());
|
||||||
|
$moduleName = end($moduleName) ?? null;
|
||||||
|
|
||||||
|
if ($moduleName) {
|
||||||
|
if (array_key_exists($moduleName, UserContext::getUserAppPermissions()) !== false) {
|
||||||
|
if (in_array($userPermissions[$moduleName], $accessRoles)) {
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
// else {
|
||||||
|
// return redirect('/menu');
|
||||||
|
// #Гаврилов
|
||||||
|
// //РЕДИРЕКТ НА СТРАНИЦУ 403
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// else {
|
||||||
|
// return redirect('/menu');
|
||||||
|
// #Гаврилов
|
||||||
|
// //РЕДИРЕКТ НА СТРАНИЦУ 403
|
||||||
|
// //redirect();
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// else {
|
||||||
|
// return redirect('/menu');
|
||||||
|
// #Гаврилов
|
||||||
|
// //КУДА РЕДИРЕКТИТЬ или что возвращать, если имя модуля не определено?
|
||||||
|
// }
|
||||||
|
|
||||||
|
//Если ошибка при обращении к api ендпоинту
|
||||||
|
if ($request->expectsJson()) {
|
||||||
|
return response()->json(['message' => "Ошибка! Функционал недоступен для вашей роли"], 403);
|
||||||
|
//Если ошибка при обращении к web роуту
|
||||||
|
} else {
|
||||||
|
#Гаврилов
|
||||||
|
//ЕСЛИ ВЫЗЫВАЕТСЯ WEB РОУТ НЕ С ФРОНТА, ТО ПРОИСХОДИТ РЕДИРЕКТ БЕЗ УКАЗАНИЯ ТЕКСТА ОШИБКИ. нАПРИМЕР, ПРИ РЕДИРЕКТЕ НИЖЕ НА СТРАНИЦУ МЕНЮ, ПОЛЬЗОВАТЕЛЬ НЕ УВИДИТ НИКАКОГО ОПОВЕЩЕНИЯ ОБ ОШИБКЕ.
|
||||||
|
//ЭТУ ПРОБЛЕМУ Я ИСПРАВЛЯЛ, ЧЕРЕЗ ГЕНЕРАЦИЮ НОТИФИКАЦИЙ НА БЭКЕ И ДОБАВЛЕНИЯ ИХ В ОПРЕДЕЛЕННУЮ ОЧЕРЕДЬ REDIS, КОТОРУЮ ЧИТАЕТ КАЖДАЯ СТРАНИЦА ПРИ ПЕРВИЧНОМ РЕНДЕРИНГЕ. НАДО ПОСМОТРЕТЬ ГДЕ Я УЖЕ ТАКОЕ РЕАЛИЗОВЫВАЛ
|
||||||
|
return redirect('/menu');
|
||||||
|
}
|
||||||
|
#Гаврилов
|
||||||
|
//РЕДИРЕКТ НА СТРАНИЦУ 403
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user