Jetstream 非开箱即用黑盒,需手动确认配置、执行迁移、理解其与 Sanctum 的耦合关系:jetstream:install 仅生成代码,必须运行 php artisan migrate 创建 teams、personal_access_tokens 等表;config/jetstream.php 中 features 需显式启用双因素、团队、API 等功能并清缓存;Sanctum 配置须手动发布且正确设置 SANCTUM_STATEFUL_DOMAINS;团队与 API token 权限默认解耦,需自行实现作用域过滤。

Jetstream 不是“装完就能用”的黑盒,它默认启用一堆功能但不会自动暴露所有入口;你得手动确认配置、补全迁移、并理解它和 Sanctum 的耦合关系——否则登录页能进,API 认证会静默失败。
jetstream:install 命令执行后必须立刻跑 migrate
Jetstream 的 php artisan jetstream:install livewire 或 php artisan jetstream:install inertia 只生成代码和配置,不执行数据库变更。它依赖的表(比如 teams、user_teams、personal_access_tokens)不会自动创建。
- 漏掉
php artisan migrate→ 注册时抛出SQLSTATE[42S02]: Base table or view not found - 如果已运行过迁移但没清缓存,可能因旧 migration 缓存导致字段缺失(如
two_factor_secret字段为空) - Livewire 版本还需确保
npm install && npm run build成功,否则resources/js/Pages/Auth/Login.vue(Inertia)或resources/views/auth/login.blade.php(Livewire)里的组件无法渲染
config/jetstream.php 里 features 必须显式开启所需功能
Jetstream 默认只启用基础认证(注册/登录),双因素、团队、API Token 等全靠 config/jetstream.php 的 'features' 数组控制。不配就等于没开,前端按钮和后端逻辑都不会加载。
-
Features::twoFactorAuthentication()不加 → 用户看不到「启用双重验证」按钮,two_factor_secret字段也不会被写入 -
Features::teams()不加 → 即使数据库有teams表,TeamController路由和权限策略也完全不注册 - 修改后必须运行
php artisan config:clear,否则缓存会导致新配置不生效
API 认证依赖 Sanctum,但 Jetstream 不自动发布 Sanctum 配置
Jetstream 内置了 Sanctum 支持,但它只安装包、注册服务提供者,不发布 config/sanctum.php。这意味着跨域请求(比如 Vue 前端调用 /api/user)大概率 401,且错误信息极不明确。
- 必须手动运行
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" - 检查
.env中SANCTUM_STATEFUL_DOMAINS是否包含你的前端域名(如localhost:5173或myapp.test) - Inertia 用户还要确认
app/Http/Middleware/HandleInertiaRequests.php里是否已添加'X-XSRF-TOKEN'到share(),否则 XSRF 校验失败
二因素认证启用后,密码确认中间件会拦截敏感操作
Jetstream 启用 Features::twoFactorAuthentication() 后,所有涉及密钥变更的操作(如禁用 2FA、重置恢复码)都会触发 ConfirmsPassword 中间件。它不是弹窗提示,而是直接跳转到 /user/confirm-password 页面等待用户重新输入密码。
- 这个页面默认存在,但如果你删过
resources/views/auth/confirm-password.blade.php或覆盖了ConfirmablePasswordResponse,就会 404 - Livewire 版本中,
ConfirmablePasswordResponse类在vendor/laravel/jetstream/src/Actions/ConfirmablePasswordResponse.php,别误删 - 若想跳过该确认(仅限开发环境),可临时注释
app/Providers/JetstreamServiceProvider.php中对ConfirmsPassword的注册
最常被忽略的是:Jetstream 的团队功能与 Sanctum 的 API token 权限模型是解耦的——你开了 Features::teams(),不代表 API token 自动绑定到当前团队。需要自己在 App\Models\Token 或中间件里做 scope 过滤,否则一个 token 可能跨团队读写数据。


















