首页 > 解决方案 > 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. 但结果总是刷新(或重定向到)登录页面。

我错过了什么吗?

标签: phplaravelauthenticationredirect

解决方案


经过一番研究,我找到了解决方案:密码哈希不再匹配。幸运的是,我已经存储了用户的凭据,并且能够使用以下方法重新哈希密码php artisan tinker

echo Hash::make('password');

推荐阅读