fortify不是开箱即用的认证包,需手动启用features、清缓存、编写blade视图、配置authenticateusing()登录逻辑,并重写registeredusercontroller实现注册后初始化;否则/login等路由404。

Fortify 不是装完就能用的认证包,它默认不注册任何路由、不提供任何视图、不自动处理登录判断——你得手动开功能、清缓存、写模板、配逻辑,否则访问 /login 直接 404。
config/fortify.php 的 features 必须显式填值
运行 php artisan fortify:install 后,config/fortify.php 里的 'features' 是空数组。这意味着:
-
/login、/register、/password/reset等所有路由根本不会被注册 - 表单提交会返回 404,不是“页面空白”,是路由根本不存在
- 只改配置但没执行
php artisan config:clear,缓存仍生效,路由还是不出现
按需启用功能常量:
-
Features::registration()→ 注册流程(含邮箱验证开关) -
Features::resetPasswords()→ 密码重置(依赖MAIL_MAILER配置) -
Features::emailVerification()→ 邮箱验证(要求User实现MustVerifyEmail) -
Features::twoFactorAuthentication()→ TOTP 双因素(需额外装pragmarx/google2fa)
Blade 视图必须手写,且字段名不能错
Fortify 不提供任何 Blade 文件。你访问 /login 看到 “Route not found”,是因为没有视图——连控制器都没机会执行。
必须手动创建:
-
resources/views/auth/login.blade.php:含@csrf,name="email"和name="password" -
resources/views/auth/register.blade.php:字段名必须匹配默认规则(name、email、password、password_confirmation)
常见坑:
- 密码确认字段写成
password_confirm或confirm_password→ConfirmedPasswordRule不生效 - 没加
@error('email')→ 错误不会显示,用户只看到空白提交 - 注册表单
action没指向/register→ 提交到错误路由,405 或 419
authenticateUsing() 是登录逻辑唯一接管点
想支持手机号或邮箱登录、加 IP 白名单、查账号状态?只能在 Fortify::authenticateUsing() 里做。
关键约束:
- 闭包接收
Request $request,必须返回User实例才成功;返回null或抛异常 = 认证失败 - 不能在里面调用
Auth::login()—— Fortify 内部会自动绑定 session 或 token - 密码比对必须手动写:
Hash::check($request->password, $user->password),Fortify 不再代劳 - 别 throw Exception —— 会绕过 Fortify 的 422 响应和重定向逻辑,前端收不到错误提示
注册后跳转与初始化要进控制器里写
注册成功默认跳 config('fortify.home'),但实际项目往往需要发邮件、绑角色、记来源。这些无法靠配置完成。
正确做法:
- 新建控制器继承
RegisteredUserController,重写store方法 -
$user = app(CreateNewUser::class)->create($request->all())后,立刻追加逻辑:$user->assignRole('member') - 若启用了邮箱验证(
MustVerifyEmail),注册后不会自动登录,需显式Auth::login($user)才能跳首页 - 重定向建议用
return redirect()->intended(),而不是硬编码路径
最常被忽略的一点:Fortify 的所有功能都建立在「你已理解 Laravel 原生认证机制」基础上。它不封装 Auth facade,不隐藏 session 绑定时机,也不替你处理 CSRF 或中间件顺序——一旦路由、视图、回调三者中任一环没对齐,问题就表现为静默失败或 404,而不是清晰报错。











