57 lines
1.8 KiB
PHP
57 lines
1.8 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Middleware;
|
||
|
||
use Closure;
|
||
use Route;
|
||
use Arr;
|
||
|
||
/**
|
||
* 檢查Admin選單項目的route權限
|
||
*
|
||
* Class CheckAdminMenuPagePermission
|
||
* @package App\Http\Middleware
|
||
*/
|
||
class CheckAdminMenuPagePermission
|
||
{
|
||
/**
|
||
* 處理並檢查Admin選單項目的route權限
|
||
*
|
||
* @param \Illuminate\Http\Request $request
|
||
* @param \Closure $next
|
||
* @return mixed
|
||
*/
|
||
public function handle($request, Closure $next)
|
||
{
|
||
//取得目前的Route
|
||
$currentRoute = Route::current();
|
||
//取得目前的Route Controller
|
||
$menuController = $currentRoute->controller;
|
||
//取得目前的Route Method
|
||
$method = $currentRoute->getActionMethod();
|
||
|
||
//如果Controller為選單項目的子類別
|
||
if(is_subclass_of($menuController, \App\Http\Controllers\Admin\Menu\BaseMenuItemController::class)) {
|
||
//如果方法為預設的route方法
|
||
if($method == 'handle') {
|
||
//取得slug組成的route name
|
||
$routeName = str_replace(config('admin.route_name_prefix') . config('admin.menu.route_name_prefix'), '', Route::currentRouteName());
|
||
//取得Admin選單項目
|
||
$adminMenu = app('AdminMenu')->getMenu();
|
||
//分解Slug
|
||
$slugs = explode('.', $routeName);
|
||
//如果slug數量大於1,則為子選單controller
|
||
if(sizeof($slugs) > 1) {
|
||
$permission = Arr::get($adminMenu, "{$slugs[0]}.children.{$slugs[1]}.userHasPermission");
|
||
} else {
|
||
$permission = Arr::get($adminMenu, "{$slugs[0]}.userHasPermission");
|
||
}
|
||
if(!$permission) {
|
||
abort(403);
|
||
}
|
||
}
|
||
}
|
||
return $next($request);
|
||
}
|
||
}
|