shouldPassThrough($request) || $user->isAdministrator() || $this->checkRoutePermission($request) ) { return $next($request); } if (!$user->allPermissions()->first(function ($permission) use ($request) { return $permission->shouldPassThrough($request); })) { Checker::error(); } return $next($request); } /** * If the route of current request contains a middleware prefixed with 'admin.permission:', * then it has a manually set permission middleware, we need to handle it first. * * @param Request $request * * @return bool */ public function checkRoutePermission(Request $request) { if (!$middleware = collect($request->route()->middleware())->first(function ($middleware) { return Str::startsWith($middleware, $this->middlewarePrefix); })) { return false; } $args = explode(',', str_replace($this->middlewarePrefix, '', $middleware)); $method = array_shift($args); if (!method_exists(Checker::class, $method)) { throw new \InvalidArgumentException("Invalid permission method [$method]."); } call_user_func_array([Checker::class, $method], [$args]); return true; } /** * Determine if the request has a URI that should pass through verification. * * @param \Illuminate\Http\Request $request * * @return bool */ protected function shouldPassThrough($request) { foreach (config('admin.permission.except', []) as $except) { $except = admin_base_path($except); if ($except !== '/') { $except = trim($except, '/'); } if (Helper::matchRequestPath($except)) { return true; } } return false; } }