Fortify默认不生效,必须显式启用features并配置路由、视图和认证逻辑:需在config/fortify.php中填入Features::registration()等常量,运行php artisan config:clear,手动创建Blade模板,严格匹配表单字段名,并在FortifyServiceProvider中配置authenticateUsing()等逻辑。

Fortify 不是“配好了就能用”的开箱方案,它默认不生效——必须显式启用 features 才会注册对应路由和控制器逻辑。
config/fortify.php 的 features 必须手动开启
安装 laravel/fortify 并运行 php artisan fortify:install 后,config/fortify.php 里的 'features' 默认是空数组。这意味着:/login、/register、/password/reset 等所有路由都不会被注册,表单提交会直接 404。
你需要按需填入功能常量:
-
Features::registration()→ 启用注册流程(含邮箱验证逻辑) -
Features::resetPasswords()→ 启用密码重置(需配置MAIL_MAILER) -
Features::emailVerification()→ 启用邮箱验证(要求User实现MustVerifyEmail) -
Features::twoFactorAuthentication()→ 启用 TOTP(依赖pragmarx/google2fa和 QR 码库)
常见错误:只改了 features 数组但没执行 php artisan config:clear,导致缓存旧配置,路由仍不出现。
Fortify 路由不自动渲染视图,Blade 模板要自己写
Fortify 只提供控制器和验证逻辑,不提供任何 Blade 文件。你访问 /login 时看到的是 Laravel 默认的 “Route not found”,不是登录页空白——因为根本没定义视图返回。
必须手动创建:
-
resources/views/auth/login.blade.php(含@csrf、name="email"、name="password") -
resources/views/auth/register.blade.php(字段名需与Fortify::createUsersUsing()中的参数一致) - 每个表单都要用
@error('email')显式输出错误,Fortify 不自动注入错误到 session 共享变量
注意:name 属性必须严格匹配 Fortify 内部验证规则字段名(如注册时默认是 name、email、password),否则 $request->validate() 会失败且无提示。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
登录逻辑可替换,但 authenticateUsing() 有调用时机限制
若想支持“手机号或邮箱登录”,需在 app/Providers/FortifyServiceProvider.php 的 boot() 方法中调用 Fortify::authenticateUsing()。
关键点:
- 该回调函数接收
Request $request,必须返回一个User实例,或null(表示失败) - 不能在里面 throw Exception,否则会绕过 Fortify 的错误处理流程,前端收不到 422 或重定向
- 密码验证必须手动调用
Hash::check($request->password, $user->password),Fortify 不再帮你做这一步 - 如果启用了
emailVerification,返回的用户还必须已验证邮箱,否则登录后会被重定向到 verify-email
典型误操作:在回调里直接 Auth::login($user),这会导致 session 已建立但 Fortify 的后续中间件(如两步验证跳转)失效。
Fortify 和 Sanctum/Passport 的集成不是自动的
Fortify 处理的是「用户凭据认证」,而 Sanctum/Passport 解决的是「已认证用户的 API Token 管理」。两者职责分离,不会互相感知。
要让登录后的用户能用 Sanctum 访问 API:
- 确保
config/sanctum.php中的'stateful'包含你的前端域名(如['localhost:5173']) - Fortify 登录成功后,Sanctum 的
EnsureFrontendRequestsAreStateful中间件才起作用 - API 路由必须用
middleware(['auth:sanctum']),不能用auth(那是 session 守护器) - 前端发起请求时必须携带 cookie(
credentials: 'include'),否则 Sanctum 认不出已登录用户
最容易忽略的一点:Fortify 的登录接口(POST /login)本身是 stateful 的,但如果你用 Postman 测试 API,不带 cookie 就永远拿不到 token——这不是 Fortify 的问题,而是 Sanctum 的会话机制决定的。










