首页 > 解决方案 > 中间件“身份验证”说明

问题描述

我使用 Laravel 5.8,我遇到了以下情况:

我有一个带有按钮的简单表单,该按钮向路由发送删除请求。表单的工作方式如下:按下按钮时,表单的操作会将我重定向到 URL localhost/delete/4,其中 4 是数据库中条目的 id,然后路由启动,控制器删除我的条目。

但是,未经身份验证的用户无权访问表单的按钮,并且路由受中间件“auth”保护。但是,如果我作为未经身份验证的用户在地址栏 localhost/delete/4 中键入,我会收到一个方法不受支持的错误,这是预期的,因为我向删除类型路由发送了一个 get 请求。

但我的问题是为什么我会收到这个错误?既然路由受到中间件的保护以防止未经身份验证的用户,为什么请求会到达路由,因为它应该被中间件阻止?

下面你得到了路线:

Route::delete('/delete/{id}', ['uses' => 'LibraryController@getLibraryDelete', 'middleware' => 'auth']);

哦,顺便说一句,如果更改接收 get 请求的路由,然后重试,中间件工作正常

标签: phplaravel-5

解决方案


在去中间件和控制器之前首先检查路由......所以如果实际上没有找到路由,脚本不知道要转到哪个中间件或控制器......

--

这是一个很好的用例,例如有人想定义以下路线

Route::get('/question/{id}', 'QuestionController@view');

GET /question/1对所有用户公开并返回问题本身(只读)

Route::patch('/question/{id}', 'QuestionController@edit')->middleware('auth');

PATCH /question/1只有经过身份验证的用户才能编辑问题...

因此,不同的方法可以有不同的中间件或同一路由没有中间件是可以接受的......并且某些方法没有定义/允许

--

该方法不受支持,因为您定义的路线仅用于删除,就像::delete您使用的方法一样

删除请求是一个带有名为“_method”和值为“delete”的查询的 HTTP POST 请求,或者在支持的浏览器中是一个 HTTP DELETE 请求

当用户在地址栏中手动输入 url 时,这是一个 GET 请求,可以通过此路由方法处理 ::get

最新文档中可用的路由方法:(https://laravel.com/docs/5.8/routing

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

::any加上接受任何方法的特殊路线

在 laravel 中,如果用户到达一个已定义但使用未在路由中定义的方法的 url,则会得到此“方法不受支持”

在这种情况下,方法不受支持的错误与身份验证中间件无关......它只是关于路由


推荐阅读