Auth::attempt() 登录失败因默认只校验 email/password 字段,若用 username 或 phone 需显式传入;须确认 guard 对应 provider 的模型正确、getAuthPassword() 返回真实密码字段;注册后自动登录失效多因 create() 未返回已保存用户实例;密码重置 token 404 常因 password_resets.token 长度不足 255 或 APP_URL 配置错误;自定义登录页需确保 CSRF、路由、中间件及命名空间一致。

Auth::attempt() 登录失败但没报错?检查凭证字段和 guard 配置
默认 Auth::attempt() 只校验 email 和 password 字段,如果你的用户表用的是 username 或 phone 作登录名,它会静默失败。不是 bug,是设计如此。
- 必须显式传入字段名:
Auth::attempt(['username' => $request->username, 'password' => $request->password]) - 确认当前 guard 指向的 provider 是否正确——查
config/auth.php里的'guards.web.provider'对应的providers.users.model,是否真指向你改过的 User 模型 - 如果模型里重写了
getAuthPassword(),确保返回的是数据库中真实存在的密码字段(比如return $this->passwd;),否则哈希比对永远不通过
注册后自动登录失效?别漏掉 create() 返回的模型实例
Laravel 默认注册逻辑在 RegistersUsers trait 里,关键点在于:它调用 $this->create($request->all()) 后,**必须返回一个已保存的 User 实例**,否则 Auth::login() 会收不到有效对象。
- 如果你重写了
register()或create()方法,检查有没有写return new User(...)却忘了save(),或者用了create()静态方法但没 return - 常见翻车写法:
User::create([...]); return $user;—— 前面那句新建了对象但没赋值给$user,后面 return 的是 null - 更安全的做法:统一用
return User::create([...]);,Laravel 的create()本身就会 return 新模型
密码重置链接 404 或 token 不匹配?重点看 URL 签名和数据库字段长度
ResetPasswordController 依赖 Laravel 的签名 URL 机制,且 password_resets 表中 token 字段默认是 VARCHAR(191),但 Laravel 9+ 生成的 token 是 255 字符,直接截断导致验证失败。
- 运行迁移修复字段:
php artisan migrate:fresh或手动改 schema:$table->string('token', 255)->change(); - 确认
APP_URL在.env中设置正确(不能带尾部斜杠),否则签名 URL 生成和验证时 host 不一致,URL::signedRoute()会拒绝请求 - 测试时别用 tinker 直接调
Auth::resetPassword(),它不触发邮件发送逻辑;真正走流程得用ForgotPasswordController@sendResetLinkEmail
自定义登录页不走 Laravel Auth 流程?中间件和命名空间容易串
手写 login.blade.php 很常见,但很多人卡在表单提交后 419 或重定向回首页——本质是 CSRF、路由 name、中间件三者没对齐。
- 表单必须包含
@csrf,且提交地址必须是POST /login(除非你改了auth.login路由) - 检查
app/Http/Controllers/Auth/LoginController.php是否还挂着use AuthenticatesUsers;,如果删了这个 trait,就得自己实现login()方法,包括调用Auth::attempt()和处理跳转 - 别把自定义控制器放进
App\Http\Controllers\Auth目录却没加namespace App\Http\Controllers\Auth;,PHP 自动加载会找不到类,结果 fallback 到框架默认逻辑
最常被忽略的是 guard 和 provider 的绑定关系——改了一个地方,另一处没同步,整个认证链就断在看不见的地方。多看两眼 config/auth.php,比反复试错快得多。










