Laravel 5 中间件在限制后仍然执行
Laravel 5 middleware executes even after restriction
我有一个中间件,如果路由不允许他访问,它会限制对路由的访问。我添加在:kernel.php
protected $middleware = [ \App\Http\Middleware\MyMiddlware::class,]
public function handle($request, Closure $next)
{
$response = $next($request);
$currentRoute = $request->route()->getName();
$accessibleMenu = $this->menu->where('route_name', $currentRoute)->first();
dd('middleware');
if ($this->auth->check() && !is_null($accessibleMenu)) {
$userRole = $request->user()->role()->first()->id;
if (!is_null($userRole ) && $userRole ==1) {
return $response;
}
}
return Response::make(view('noPermission'), 404);
}
路线:
Route::get('menu/list','MenuController@index')->name('menu-list');
控制器函数::
public function index($parent_id = null)
{
dd('executed');
$menus = $this->menu->orderBy('id', 'DESC')->paginate(5000);
return view('menu.index', compact('menus'));
}
现在是真实的:如果角色 id 是 2,中间件应该 return 404 查看而不执行路由。但它会在屏幕上打印执行的字符串!
1.If 我删除或评论:
$response = $next($request);
它returns
Call to a member function getName() on null
如果我将路由注册移动到
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Activity::class,
\App\Http\Middleware\MyMiddlware::class,
],
和评论:
$response = $next($request);
然后屏幕打印 "middleware" 中间件工作
我的问题是如果我使用这个,为什么中间件允许函数执行
$response = $next($request);
句柄函数的第一个?
如果我在 protected $middleware = []
数组中使用,为什么 middlware 不工作并且 getName()
的 return 为空?
laravel 在 kernel.php for - protected $middleware = [] 中说:
* 这些中间件 运行 在对您的应用程序的每个请求期间。
为什么在我限制访问后仍允许这样做?
我很难读完这篇文章,但是我认为您想更改 2 行:
移除$response = $next($request);
将return $response;
更改为return $next($request);
我想你想更改这些行,因为 $next($request)
是完整的执行。
我有一个中间件,如果路由不允许他访问,它会限制对路由的访问。我添加在:kernel.php
protected $middleware = [ \App\Http\Middleware\MyMiddlware::class,]
public function handle($request, Closure $next)
{
$response = $next($request);
$currentRoute = $request->route()->getName();
$accessibleMenu = $this->menu->where('route_name', $currentRoute)->first();
dd('middleware');
if ($this->auth->check() && !is_null($accessibleMenu)) {
$userRole = $request->user()->role()->first()->id;
if (!is_null($userRole ) && $userRole ==1) {
return $response;
}
}
return Response::make(view('noPermission'), 404);
}
路线:
Route::get('menu/list','MenuController@index')->name('menu-list');
控制器函数::
public function index($parent_id = null)
{
dd('executed');
$menus = $this->menu->orderBy('id', 'DESC')->paginate(5000);
return view('menu.index', compact('menus'));
}
现在是真实的:如果角色 id 是 2,中间件应该 return 404 查看而不执行路由。但它会在屏幕上打印执行的字符串!
1.If 我删除或评论:
$response = $next($request);
它returns
Call to a member function getName() on null
如果我将路由注册移动到
'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\Activity::class, \App\Http\Middleware\MyMiddlware::class, ],
和评论:
$response = $next($request);
然后屏幕打印 "middleware" 中间件工作
我的问题是如果我使用这个,为什么中间件允许函数执行
$response = $next($request);
句柄函数的第一个?
如果我在 protected $middleware = []
数组中使用,为什么 middlware 不工作并且 getName()
的 return 为空?
laravel 在 kernel.php for - protected $middleware = [] 中说: * 这些中间件 运行 在对您的应用程序的每个请求期间。
为什么在我限制访问后仍允许这样做?
我很难读完这篇文章,但是我认为您想更改 2 行:
移除$response = $next($request);
将return $response;
更改为return $next($request);
我想你想更改这些行,因为 $next($request)
是完整的执行。