Laravel- Auth::check returns false 在中间件中登录成功

Laravel- Auth::check returns false in the middleware for successfull login

我的登录控制器

public function authenticate(Request $request)
    {
        $credentials = $request->validate([
            'username' => ['required'],
            'password' => ['required'],
        ]);

        if (Auth::attempt($credentials)) {
            $request->session()->regenerate();
            
            return redirect()->intended('/');
        }

        return back()->withErrors([
            'error' => 'The provided credentials do not match our records.',
        ]);
    }

我检查授权的中间件

class AuthorizeUser
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (Auth::check()) {
            return $next($request);
        } else {
            return view('application');
        }
    }
}

Auth::check() 在此中间件 returns 错误事件中 Auth::attempt 成功。 如何找到此问题的原因?

检查您的用户数据库的 primary key。如果您设置 table 的主键而不是 id,则需要在您的用户模型中进行设置。

Laravel 文档说明如下:

Eloquent will also assume that each table has a primary key column named id. You may define a protected $primaryKey property to override this convention.

例如,如果您将 user_id 列设置为用户数据库中的主键,则需要在用户模型中放置以下代码:

protected $primaryKey = 'user_id';

你在auth.php使用过守卫吗? 这是你的默认守卫吗?

'defaults' => [
    'guard' => 'web',
     'passwords' => 'users',
],

将你的路由放在 Auth 或 Web 的中间件中就可以了。

您可以在 routes/api 中使用此代码。php

 Route::post('your-route-here', [ControllerNameHere::class,'FunctionNameHere'])->name('Route-Name-Here')->middleware('api');

或者您可以在 routes/web.php

中使用
 Route::post('your-route-here', [ControllerNameHere::class,'FunctionNameHere'])->name('Route-Name-Here')->middleware('web');

改用RedirectIfAuthenticated中间件:

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  ...$guards
     * @return mixed
     */
    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);
    }

谢谢大家的支持。问题出在我的会话配置上。 我之前将会话驱动程序设置为数据库并更改了会话名称。 我用默认配置替换了 session.php 和 .env 。然后上面的代码完美运行。 (我想会话配置出了点问题,当我有时间回顾那个问题时我会继续发布)