laravel 9+ 已彻底移除 php artisan make:auth,必须使用 breeze 或 sanctum:breeze 生成 blade 认证视图与路由,sanctum 用于 api 令牌认证;二者均需正确配置、迁移、编译资源并适配字段与中间件。

直接上结论:Laravel 9+ 必须用 breeze 或 sanctum,不能靠 php artisan make:auth —— 这个命令早在 Laravel 8.3 就被删了,现在执行只会报错 “Command ‘make:auth’ is not defined”。
为什么 php artisan make:auth 找不到了
这个命令在 Laravel 5.8–8.2 期间存在,但官方明确弃用并从 8.3 起彻底移除。如果你在 Laravel 9 或 10 项目里敲它,终端会直接提示命令未定义。这不是你装错了包,是框架本身已删除该功能。
- 旧项目升级后残留的文档或教程还在提它,容易误导
- 真正起作用的是脚手架包(
laravel/breeze或laravel/jetstream),它们负责生成控制器、路由和视图 - 没装脚手架包 + 没手动写登录逻辑 = 你只有
User模型和空的/login路由,访问直接 404
Auth::attempt() 总是返回 false 的常见原因
即使你写了登录逻辑,Auth::attempt() 静默失败却没报错,大概率卡在这几个地方:
- 数据库里用户密码不是用
bcrypt()加密的 ——Auth::attempt()默认只认 bcrypt,明文或 md5 都会拒之门外 - 传参字段不对:默认只检查
email和password;如果用phone登录,必须显式传数组:Auth::attempt(['phone' => $phone, 'password' => $password]) -
User模型没实现Illuminate\Contracts\Auth\Authenticatable接口,或漏了use Illuminate\Foundation\Auth\User;trait - 用户记录的
active字段为 0、email_verified_at为空且启用了邮箱验证、或password字段被截断(比如VARCHAR(60)不够存 bcrypt hash)
API 认证用 sanctum 却一直 401
Sanctum 不是“调个方法就自动登录”,它不提供 Sanctum::login() —— 这个方法根本不存在,搜到的都是过时文档或抄错的 Passport 写法。
- 正确登录流程是:
$user->createToken('api-token')->plainTextToken,拿到明文 token 后前端必须带Authorization: Bearer {token}请求头 - 如果用
localhost:3000做前端,必须从config/sanctum.php的'stateful'数组里删掉它,否则 Sanctum 强制走 session 认证,忽略 Bearer token - API 路由必须显式加中间件:
->middleware('auth:sanctum');Laravel 10+ 默认禁用EnsureFrontendRequestsAreStateful全局中间件,别指望它自动生效 - 别忘了在
User模型里use Laravel\Sanctum\HasApiTokens;,否则createToken()方法不可用
登录后跳转不到预期页面
登录成功后硬跳 /home 是 Laravel 的默认行为,但这个路径写死在 app/Providers/RouteServiceProvider.php 的 $home 属性里,不是路由配置问题。
- 改
$home = '/dashboard';最快,但要确保/dashboard路由存在且受auth中间件保护 - 想“回到上一页”,登录表单得带
<input type="hidden" name="redirect" value="{{ url()->previous() }}">,然后在LoginController里清空$redirectTo属性,让框架自动 fallback 到 redirect 参数 - 若自定义了
RedirectIfAuthenticated中间件,注意它内部也依赖route('login')—— 如果你删了命名路由或重命名了登录路由(比如叫auth.login),这里就会抛出 “Route [login] not defined” 错误
最常被忽略的一点:Breeze 安装完必须跑 npm run build(或 dev),否则 Blade 模板里引用的 CSS/JS 文件 404,页面空白或样式崩坏,你以为是认证失败,其实是前端资源没加载。











