laravel内置auth系统需手动执行命令生成登录注册页面,5.7及更早版用php artisan make:auth,5.8+已移除,8+需通过laravel/ui包实现;auth::attempt()失败不报错,常见原因包括password字段缺失或未加密、守卫配置错误;注册后auth::user()为NULL多因web中间件缺失startsession和encryptcookies;密码重置邮件发送失败常因配置未生效或缓存未清除。

Laravel 的内置 Auth 系统不是“开箱即用”的完整登录注册页面,而是提供了一套可快速 scaffold 的脚手架——你得主动执行命令生成视图和路由,否则访问 /login 会直接 404。
运行 php artisan make:auth 前必须确认 Laravel 版本
这个命令在 Laravel 5.7 及更早版本中有效;从 Laravel 5.8 开始被移除,6.x/7.x 完全废弃。如果你用的是 Laravel 8+,它已由 laravel/ui 包接管,需先安装:
composer require laravel/ui- 再执行
php artisan ui bootstrap --auth(或vue/react) - 最后运行
npm install && npm run dev编译前端资源
跳过这步直接跑 make:auth,控制台会报错 Command "make:auth" is not defined。
Auth::attempt() 失败却没报错?检查字段和守卫配置
Auth::attempt() 返回 false 时不会抛异常,容易误以为逻辑卡住。常见原因有:
- 数据库里
users表缺少password字段,或该字段不是varchar(255) - 用户密码没用
Hash::make()加密(注册时漏了),导致比对失败 - 当前守卫(guard)不是
web,比如你在 API 场景下误用了Auth::guard('api')->attempt(...),但中间件没配auth:api -
config/auth.php中'providers' => ['users' => [... 'model' => AppModelsUser::class]]指向的模型没实现Authenticatable接口(Laravel 8+ 默认已实现,老项目需手动加)
注册后自动登录,但 Auth::user() 是 null?中间件顺序错了
典型场景:注册成功后想直接重定向到首页并显示欢迎信息,结果 Auth::user() 为 null。这不是认证失败,而是请求没经过 StartSession 和 EncryptCookies 中间件。
检查 app/http/Kernel.php 的 $middlewareGroups['web'] 是否包含:
AppHttpMiddlewareEncryptCookies::classIlluminateSessionMiddlewareStartSession::classIlluminateViewMiddlewareShareErrorsFromSession::class
如果自定义了中间件组或覆盖了 web,漏掉其中任一,Session 就无法写入,认证状态就丢失。
密码重置邮件发不出?别只改 .env,还要清缓存
改完 MAIL_MAILER=smtp、MAIL_HOST=... 后仍收不到邮件,大概率是配置没生效:
- 运行
php artisan config:clear(仅清配置缓存) - 更彻底的做法:连带清空
bootstrap/cache/config.php文件 - 确保
AppModelsUser实现了MustVerifyEmail接口(如果启用了邮箱验证) - Laravel 9+ 默认使用
verify-email路由名,测试时注意 URL 是否匹配/email/verify/{id}/{hash}
真实项目里,最容易被跳过的其实是中间件顺序和配置缓存这两步——它们不报错,但让整个 Auth 流程静默失效。