Laravel 5.5 Auth认证失效求助:登录成功但未保持认证状态
首先说结论:你的User模型写法是没问题的——它继承了Authenticatable基类,也引入了必要的Notifiable Trait,所以模型本身大概率不是问题根源。咱们从几个常见的“会话丢失”场景入手排查:
1. 先确认路由是否在web中间件组里
Laravel的web中间件组包含了StartSession、AuthenticateSession这些核心会话管理中间件,如果你的登录接口或者home页面的路由没被这个中间件包裹,会话根本没法正常存储用户的认证信息。
默认情况下routes/web.php里的路由都会自动应用web中间件,但如果是你自定义的路由组,或者不小心把路由写到了routes/api.php里(api路由默认用api中间件,不带会话),就会出问题。可以手动给路由加上中间件验证:
Route::middleware('web')->group(function () { Route::post('/login', [YourAuthController::class, 'login']); Route::get('/home', function () { return view('app.home'); })->name('home'); });
2. 检查会话存储的配置与权限
如果你的会话驱动是默认的file,得确保storage/framework/sessions目录有写入权限——Laravel需要在这里存会话文件,权限不够的话会话根本存不住。可以用这条命令快速设置:
chmod -R 755 storage/framework/sessions
要是你用的是database驱动,先确认已经执行过会话表的迁移:
php artisan session:table php artisan migrate
另外,去config/session.php里看看domain配置,如果你的应用有子域名,得把它设成.yourdomain.com(前面带点),不然会话没法跨子域名共享。
3. 自定义主键的话要在模型里声明
如果你的users表主键不是默认的id(比如用了UUID字符串主键),必须在User模型里明确指定主键信息,不然Laravel找不到正确的用户标识,认证状态自然没法持久化:
class User extends Authenticatable { use Notifiable; protected $primaryKey = 'user_uuid'; // 替换成你的主键字段名 public $incrementing = false; // 字符串主键要设为false protected $keyType = 'string'; // 主键类型设为string // ... 其他原有代码 }
4. 排查有没有代码或中间件干扰会话
检查一下你的全局中间件、路由中间件,有没有在登录后意外执行session()->flush()、Auth::logout()这类清会话的操作。另外,别把AuthenticateSession中间件禁用了,它是维护用户认证会话的关键。
快速定位问题的小技巧
你可以在登录成功后立刻打印Auth::check(),再在home页面里也打印一次:
// 登录方法里 if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) { dd(Auth::check()); // 这里肯定是true,因为attempt刚成功 return redirect()->intended('home'); }
// home路由里 Route::get('/home', function () { dd(Auth::check()); // 如果这里是false,说明会话没传递过来,直接排查会话相关的问题 return view('app.home'); });
内容的提问来源于stack exchange,提问作者ryanstar

