php - Laravel 8:身份验证始终重定向回登录
问题描述
我最近将一个使用了 6 年的 Laravel 项目从 5.1 转移到了 8.x。我已经关注了升级旧的 Laravel 应用程序,现在我正在运行 Laravel 8,我无法再登录到该应用程序。我已经重写了身份验证以匹配Laravel Breeze入门套件,但我的问题仍然存在:输入用户凭据后,我总是被重定向到登录页面。
我仔细检查了用户是否真的通过输入错误的用户凭据进行了身份验证。这样做时,我正确地收到一条错误消息。输入正确的用户凭据时,我没有收到错误消息。
除了登录页面之外的所有内容都只能供经过身份验证的用户访问,因此这些是我设置的相关部分:
// /routes/web.php
Route::get('/', function () {
return redirect('login');
});
Route::get('/edit-data', function () {
return view('dashboard.edit_data');
})->middleware(['auth'])->name('edit-data');
require __DIR__.'/auth.php';
// /routes/auth.php
Route::get('/login', [AuthenticatedSessionController::class, 'create'])
->middleware('guest')
->name('login');
Route::post('/login', [AuthenticatedSessionController::class, 'store'])
->middleware('guest');
Route::post('/logout', [AuthenticatedSessionController::class, 'destroy'])
->middleware('auth')
->name('logout');
// /app/Http/Controllers/Auth/AuthenticatedSessionController.php
public function create()
{
if (Auth::check() || Auth::viaRemember()) {
return redirect('edit-data');
} else {
return view('user.login');
}
}
public function store(LoginRequest $request)
{
$request->authenticate();
$request->session()->regenerate();
Session::put('language', LanguageInterface::DE);
return redirect()->intended(RouteServiceProvider::HOME);
}
public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('login');
}
// /app/Http/Requests/Auth/LoginRequest.php
public function authenticate()
{
$this->ensureIsNotRateLimited();
if (!Auth::attempt($this->only('login', 'password'), true)) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'login' => __('auth.failed'),
]);
}
RateLimiter::clear($this->throttleKey());
}
// /app/Http/Middleware/RedirectIfAuthenticated.php
public function handle(Request $request, Closure $next, ...$guards)
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
// /app/Providers/RouteServiceProvider.php
public const HOME = '/edit-data';
我还使用 Xdebug 调试了身份验证过程,并注意到path
正确设置为/edit-data
. 但结果总是刷新(或重定向到)登录页面。
我错过了什么吗?
解决方案
经过一番研究,我找到了解决方案:密码哈希不再匹配。幸运的是,我已经存储了用户的凭据,并且能够使用以下方法重新哈希密码php artisan tinker
:
echo Hash::make('password');
推荐阅读
- python - 将子字符串的第一个实例与正则表达式匹配
- python - 编写 if 语句以避免某些列表项的更好方法是什么?
- python - 自适应浮点格式
- r - 像通常使用 add=TRUE 或 par(new=TRUE) 一样在一个图形上绘制两个 dwplot
- c# - 在大型企业级应用程序上存储文件的最佳方式
- javascript - 我的 Apollo 服务器订阅不起作用:无法读取未定义的属性“标题”
- elasticsearch - 在 Elasticsearch 中覆盖数据的更快方法
- vba - 如何在记事本中打开最近创建的 csv 文件?
- c++ - 如何在 C++ 中使用公共静态变量
- c - 如何从 ptr 获取结构页面信息并使用 kmalloc 或 vmalloc 固定内存?