如何在Laravel(搭配Inertia与Vue)中存储URL参数实现登录后跳转
完整实现步骤
1. 后端捕获并存储origin参数
首先创建中间件存储合法的来源参数,避免开放重定向漏洞:
执行命令生成中间件:php artisan make:middleware StoreOriginRedirect
编辑app/Http/Middleware/StoreOriginRedirect.php代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class StoreOriginRedirect { public function handle(Request $request, Closure $next) { // 仅当session未存储跳转地址、且请求带origin参数时执行存储 if ($request->has('origin') && !$request->session()->has('sso_redirect_url')) { // 自行维护合法来源的白名单映射,绝对不要直接使用前端传入的参数作为跳转地址 $allowOrigins = [ 'websiteb' => 'https://www.websiteb.com/sso/callback', // 其他接入站点可在这里新增 ]; if (isset($allowOrigins[$request->query('origin')])) { $request->session()->put('sso_redirect_url', $allowOrigins[$request->query('origin')]); } } return $next($request); } }
注册中间件到登录路由,编辑routes/web.php:
use App\Http\Middleware\StoreOriginRedirect; Route::get('/login', function () { return Inertia::render('Auth/Login'); })->middleware(['guest', StoreOriginRedirect::class]);
2. 自定义登录成功后的跳转逻辑
修改Jetstream的登录响应配置,编辑app/Providers/JetstreamServiceProvider.php:
use Laravel\Fortify\Fortify; use App\Providers\RouteServiceProvider; public function boot() { // 原有Jetstream配置保留,新增以下代码 Fortify::loginResponse(function (\Illuminate\Http\Request $request) { // 如果存在存储的SSO跳转地址,直接跳转并销毁session中的该字段 if ($request->session()->has('sso_redirect_url')) { $redirectUrl = $request->session()->pull('sso_redirect_url'); // 你已经熟悉Inertia外部跳转方法,此处直接调用即可 return \Inertia\Inertia::location($redirectUrl); } // 无跳转地址时走站点A默认逻辑 return redirect()->intended(RouteServiceProvider::HOME); }); }
3. Vue侧适配(仅需注意异常场景)
你不需要修改登录表单的核心逻辑,Inertia默认会保留当前URL的参数,就算登录请求报错(比如密码错误),origin参数依然会保留在地址栏,下次提交请求时中间件会重新校验存储。如果要做优化,可以在Login.vue组件挂载时,把origin参数存入表单的隐藏字段,不过这一步是非必须的。
注意:所有跳转地址必须走白名单校验,禁止直接拼接前端传入的origin参数生成跳转地址,避免开放重定向安全漏洞。
内容的提问来源于stack exchange,提问作者Thbwun
相关产品推荐
相关产品推荐

