laravel 9+ 推荐使用 Breeze 实现认证:需安装 breeze、运行 install 命令、编译资源、执行迁移;登录跳转由 RouteServiceProvider 的 $home 属性控制;Auth::attempt() 默认校验 email/password,自定义字段需显式传入;密码重置依赖正确邮件配置与 Token 字段长度适配。

Laravel 自带的 Auth 系统不是“开箱即用”的完整登录页,而是提供可组合的认证骨架——你得手动触发安装、适配路由、补全视图,否则 php artisan make:auth(Laravel 5.8–8.x)或 php artisan breeze:install(9.x+)命令跑完,依然会报 Route
not defined 或视图缺失。
如何正确启用 Laravel 内置认证(Laravel 9+ 推荐 Breeze)
Laravel 9 起官方移除了 make:auth,改推轻量方案 breeze。它不强制依赖 Jetstream 的 Inertia/Teams,只生成 Blade + Tailwind 的基础认证流。
- 运行
composer require laravel/breeze --dev - 执行
php artisan breeze:install(默认生成 Blade 模板) - 运行
npm install && npm run build编译 css/js - 执行
php artisan migrate创建users和password_resets表(若尚未运行过迁移)
此时 routes/web.php 里已自动注册了 /login、/register 等路由,控制器在 app/http/Controllers/Auth 下,视图位于 resources/views/auth/。
为什么登录后跳转到 /home 而不是预期页面?
Laravel 默认把登录成功后的重定向地址写死在 app/Providers/RouteServiceProvider.php 的 $home 属性里,值为 '/home'。如果项目没有 /home 路由或你想跳回来源页,必须改这里。
- 修改
$home属性:例如设为'/dashboard',同时确保该路由存在且有对应中间件(如auth) - 更灵活的做法是覆盖
RedirectIfAuthenticated中间件里的逻辑,或在LoginController中重写redirectTo()方法 - 若需“登录后回到原页面”,确保登录表单提交时带了
url()->previous()生成的redirect参数,并在LoginController的$redirectTo属性中留空,让框架自动 fallback 到redirect参数值
Auth::attempt() 失败但无提示?检查这些关键点
手动调用 Auth::attempt() 是绕过 Breeze 默认流程的常见做法(比如对接手机号登录),但极易因字段或配置错位导致静默失败。
-
Auth::attempt()默认只检查email和password字段;若用username或phone,需显式传入数组:Auth::attempt(['phone' => $phone, 'password' => $password]) - 确保用户模型(如
User)实现了IlluminateContractsAuthAuthenticatable接口,且$fillable包含验证字段(如phone) - 密码必须是经
Hash::make()加密存储的;明文或其它算法(如 MD5)会导致比对永远失败 - 用户状态字段(如
is_active)若存在,需在authenticate方法中手动追加条件,因为Auth::attempt()不自动过滤
if (Auth::attempt(['phone' => $request->phone, 'password' => $request->password], $request->remember)) { return redirect()->intended('/dashboard'); } return back()->withErrors(['phone' => '手机号或密码错误']);
忘记密码流程为何收不到邮件?
ResetPassword 流程依赖 Laravel 的 Mail 配置和队列(如果启用了队列)。即使没配队列,邮件也必须能发出,否则 SendPasswordResetLink 会静默失败。
- 确认
.env中MAIL_MAILER已设为smtp(或log用于调试),且MAIL_HOST、MAIL_PORT、MAIL_USERNAME、MAIL_PASSWORD均正确 - 执行
php artisan config:clear清除配置缓存,避免旧配置生效 - 临时将
MAIL_MAILER=log,然后触发重置请求,查看storage/logs/laravel.log是否记录了邮件内容 - 若用队列发送邮件,确保队列服务(如 redis、database)已启动,并运行
php artisan queue:work
真正麻烦的是密码重置链接有效期与数据库字段长度:Laravel 默认用 60 分钟过期,且 password_resets 表的 token 字段是 VARCHAR(100),如果你替换了 token 生成逻辑(比如用 JWT),必须同步扩大字段长度,否则插入失败导致整个流程中断。