首页 > 解决方案 > Laravel Auth::user() 返回 null 除了登录功能

问题描述

我正在使用 Inertia.js 开发 Laravel 8 项目。在登录功能中,我可以使用 Auth::user() 来获取用户。但是,登录后,其他函数在 Auth::user() 中得到一个空值。我不确定出了什么问题。有人能帮我吗?

我认为 Laravel Auth 使用会话来识别当前用户,所以我尝试dd($request->session()->all());在登录之前和之后列出会话。并且“_token”的会话值不会改变。

登录功能

public function handleProviderCallback(Request $request)
{
    // user from socialite
    $user = \Socialite::with('portal')->user(); 
    
    // user here in database
    $account = User::where('account', $user->id)->first(); 
    if (!$account) {
        User::create([
            'account' => $user->id,
        ]);
        $account = User::where('account', $user->id)->first();
    }

    Auth::login($account);
    //dd(Auth::user());

    return Inertia::render('Home/index');
}

为空的函数

public function getUser(Request $request)
{
    dd(Auth::user());

    return Auth::user();
}

以下是一些可能需要也可能不需要的信息。

网页.php

Route::get('/login', 'Auth\PortalLoginController@redirectToProvider')
    ->name('login');
Route::get('getUser', ['as' => 'getUser', 
    'uses' => 'Auth\PortalLoginController@getUser']);
Route::get('session', ['as' => 'session', 
    'uses' => 'Auth\PortalLoginController@listSession']);

授权文件

return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],
    'password_timeout' => 10800,
];

标签: phplaravellaravel-8

解决方案


Laravel 需要auth中间件来检查身份验证并初始化 Auth 服务。因此,您需要将auth中间件添加到您要访问的所有路由中Auth::user()

所以更新你的路线routes/web.php

Route::get('/login', 'Auth\PortalLoginController@redirectToProvider')->name('login');
Route::get('getUser', ['as' => 'getUser', 'uses' => 'Auth\PortalLoginController@getUser'])->middleware('auth');
Route::get('session', ['as' => 'session', 'uses' => 'Auth\PortalLoginController@listSession'])->middleware('auth');

推荐阅读