【问题标题】:Middleware 'auth' clarification中间件“身份验证”说明
【发布时间】:2019-04-13 15:54:22
【问题描述】:

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

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

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

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

下面你得到了路线:

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

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

【问题讨论】:

  • 您定义的路由的delete 版本受中间件保护。您未定义的get 版本不存在,因此无法保护。所以你得到了MethodNotSupported 错误。
  • @TimLewis 但是,由于获取版本不存在并且删除版本受到保护并且请求无法到达,我不应该收到“路线不存在”错误吗?
  • 呃,我只是在控制器的构造中$this->middleware('auth')->except();
  • 嗯,不,路线确实存在,只是方法GET不被支持......也许是奇怪的措辞,但这只是捕获的优先级;你会得到一个NotSupported,然后是一个404,然后是中间件。

标签: php laravel-5


【解决方案1】:

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

--

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

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,但使用未在路由中定义的方法,则会得到此“方法不受支持”

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

【讨论】:

  • @SirNash 哇,我当然没想到会这样“在去中间件和控制器之前先评估路由......”
  • 当您可以为同一个 url 定义两条路由时,我用一个更好的用例编辑了我的答案...
  • @GrosuCosminIonut 你可以在这里阅读更多关于生命周期本身的信息laravel.com/docs/5.8/lifecycle,它是“调度请求”部分,它说一旦服务提供者被加载,请求就会被发送到路由器,然后路由器决定哪个路由->middleware->controller to run....如果方法不允许,则意味着它从未找到相应的路由...
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 2012-04-12
  • 2019-03-15
  • 1970-01-01
  • 2017-06-14
  • 2021-01-21
  • 2019-02-27
  • 2017-02-26
相关资源
最近更新 更多