【发布时间】:2016-07-16 09:48:57
【问题描述】:
如果涉及到身份验证中间件,是否应该使用闪存数据进行重定向?
需要注意的一些内务事项将回答一些可能的后续问题:
- 我正在调用 Web 中间件。
- 我正在使用文件会话驱动程序。
- 我可以检索存储在会话中的值,但闪存数据除外。
- 我已尝试通过在 Authenticate 中间件中添加以下行来重新刷新刷新的数据:
$request->session()->reflash();
- 我已尝试通过在 Authenticate 中间件中添加以下行来重新刷新刷新的数据:
因此,Authenticate.php 现在显示如下:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('login');
}
}
$request->session()->reflash();
return $next($request);
}
这个问题也影响了 make:auth 生成的 auth 样板,导致 $errors 出错时无法显示。
更新(3/29 @ 08:54 EST)
我发现了我认为是根本原因的原因,如下所示。每条路线都调用了两次“网络”中间件。因此,实际上发生了两个请求,即在用户有机会看到它们之前将其删除。原路线:列表如下。
+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | groups | | App\Http\Controllers\GroupsController@index | web,web,auth |
| | GET|HEAD | groups/set-default/{id} | | App\Http\Controllers\GroupsController@setDefaultGroup | web,web,auth |
| | GET|HEAD | home | | App\Http\Controllers\HomeController@index | web,web,auth |
| | GET|HEAD | login | | App\Http\Controllers\Auth\AuthController@showLoginForm | web,web,guest |
| | POST | login | | App\Http\Controllers\Auth\AuthController@login | web,web,guest |
| | GET|HEAD | logout | | App\Http\Controllers\Auth\AuthController@logout | web,web |
| | POST | password/email | | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,web,guest |
| | POST | password/reset | | App\Http\Controllers\Auth\PasswordController@reset | web,web,guest |
| | GET|HEAD | password/reset/{token?} | | App\Http\Controllers\Auth\PasswordController@showResetForm | web,web,guest |
| | GET|HEAD | register | | App\Http\Controllers\Auth\AuthController@showRegistrationForm | web,web,guest |
| | POST | register | | App\Http\Controllers\Auth\AuthController@register | web,web,guest |
| | GET|HEAD | visitees | | App\Http\Controllers\VisiteesController@index | web,web,auth |
| | GET|HEAD | visitees/check-in/{id} | | App\Http\Controllers\VisiteesController@checkIn | web,web,auth |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+---------------+
从“网络”中间件中删除路由后,我的路由现在如下所示:
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | groups | | App\Http\Controllers\GroupsController@index | web,auth |
| | GET|HEAD | groups/set-default/{id} | | App\Http\Controllers\GroupsController@setDefaultGroup | web,auth |
| | GET|HEAD | home | | App\Http\Controllers\HomeController@index | web,auth |
| | GET|HEAD | login | | App\Http\Controllers\Auth\AuthController@showLoginForm | web,guest |
| | POST | login | | App\Http\Controllers\Auth\AuthController@login | web,guest |
| | GET|HEAD | logout | | App\Http\Controllers\Auth\AuthController@logout | web |
| | POST | password/email | | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,guest |
| | POST | password/reset | | App\Http\Controllers\Auth\PasswordController@reset | web,guest |
| | GET|HEAD | password/reset/{token?} | | App\Http\Controllers\Auth\PasswordController@showResetForm | web,guest |
| | GET|HEAD | register | | App\Http\Controllers\Auth\AuthController@showRegistrationForm | web,guest |
| | POST | register | | App\Http\Controllers\Auth\AuthController@register | web,guest |
| | GET|HEAD | visitees | | App\Http\Controllers\VisiteesController@index | web,auth |
| | GET|HEAD | visitees/check-in/{id} | | App\Http\Controllers\VisiteesController@checkIn | web,auth |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
将路由移出“网络”中间件组后,闪烁消息会正确显示。 但是,现在我有一个新问题!
在初始请求后,闪存消息不会从会话中删除。它们保留每个后续请求,直到它们被手动刷新或忘记。
此时我不确定是否应该提出第二个问题,专门解决闪存数据的持久性问题。如果有请告知。
【问题讨论】:
-
介意显示 issue artisan command
php artisan route:list的输出? -
@terrylow 我根据您的要求添加了路线:列表。我做了一些额外的发现,并将继续深入研究这个问题。感谢所有帮助!
-
请恢复您的路由并执行
composer update,在 laravel/framwork 5.2.27 的发布中已经解决了双 web 中间件身份验证路由错误,然后运行php artisan make:authbtw 删除你有手动刷新会话的行,你的问题应该不会再出现了 -
@terrylow 我更新到 5.2.27。我的路由仍然显示 Web 中间件在我的路由上应用了两次。与 Route::auth() 关联的路由是正确的。为了删除重复的“网络”,我不得不将其余路由移出“网络”中间件。 flash 消息再次出现,但它们在后续请求中仍然存在,包括与 auth $errors 关联的请求。
-
这很奇怪,所以如果您的路由不在网络中间件中,那么 Flash 消息是否可以正常工作?你删除了
$request->session()->reflash();行吗?
标签: php laravel laravel-5.2 flash-message