Laravel调用auth()->login()后未保存会话,Auth::user()返回null
在Laravel项目中使用Socialite实现Google登录,重定向与回调功能运行正常,但调用auth()->login()后会话未被持久化。在LoginController的callback方法内,Auth::user()可正常获取用户信息;但跳转至DebugController的__invoke方法后,Auth::user()返回null。
相关代码
LoginController
class LoginController extends Controller { public function callback(Request $request) { $googleUser = Socialite::driver('google')->user(); $userLogin = [ 'id' => $googleUser->getId(), 'name' => $googleUser->getName(), 'email' => $googleUser->getEmail(), 'avatar' => $googleUser->getAvatar(), ]; $email = $userLogin['email']; $user = User::updateOrCreate( ['email' => $email], $userLogin ); auth()->login($user); // 此处Auth::user()可正常获取数据 // dd(auth()->user()); return redirect()->route('debug'); } }
DebugController
class DebugController extends Controller { public function __invoke() { $user = auth()->user(); // 此处返回null dd($user); } }
解决方案
验证用户模型合规性
确保User模型继承Illuminate\Foundation\Auth\User或实现Illuminate\Contracts\Auth\Authenticatable接口,自定义模型需保证getAuthIdentifier()等核心方法正确返回用户主键。检查会话驱动配置
查看.env文件的SESSION_DRIVER配置,若使用database或redis驱动,需确认对应服务/数据表正常运行。可临时切换为file驱动测试是否为驱动问题。确认路由中间件
保证DebugController的路由包含在web中间件组内,该组包含StartSession、EncryptCookies等会话必需的中间件。若路由仅使用api中间件,会因无会话支持导致认证失效。示例路由配置:Route::get('/debug', DebugController::class)->name('debug')->middleware('web');手动刷新会话
在auth()->login()后调用session()->regenerate(),刷新会话ID的同时确保会话数据被正确写入:auth()->login($user); session()->regenerate(); return redirect()->route('debug');检查用户主键类型
若User模型使用非整数主键(如UUID),需在模型中添加以下配置:public $incrementing = false; protected $keyType = 'string';避免Laravel默认按整数处理主键导致会话关联失败。
清除缓存与旧会话
执行以下命令清除配置缓存和过期会话文件:php artisan config:clear php artisan cache:clear rm -rf storage/framework/sessions/*
内容的提问来源于stack exchange,提问作者Võ Bảo

