You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9中为路由URI添加用户名全局前缀的实现求助

实现方案

1. 重构路由分组

把原来固定的vendors前缀替换为动态的{username},将所有商家路由纳入这个分组,同时添加自定义中间件校验当前访问的用户名是否为登录用户:

// routes/web.php
Route::prefix('{username}')->middleware(['auth:vendor', 'check.username'])->group(function () {
    Route::get('/dashboard', [VendorController::class, 'dashboard'])->name('vendor.dashboard');
    // 其他商家相关路由都可以放在这个分组里
});

2. 创建用户名校验中间件

这个中间件用来防止用户访问不属于自己的仪表盘路径:

php artisan make:middleware CheckUsername

打开生成的app/Http/Middleware/CheckUsername.php,修改handle方法:

public function handle(Request $request, Closure $next)
{
    $currentUser = auth('vendor')->user();
    // 校验路由参数中的用户名是否与当前登录用户一致
    if ($request->route('username') !== $currentUser->username) {
        // 不一致的话跳转回自己的仪表盘,或者返回403权限错误
        return redirect()->route('vendor.dashboard', ['username' => $currentUser->username]);
    }
    return $next($request);
}

在app/Http/Kernel.php的$routeMiddleware数组中注册这个中间件:

protected $routeMiddleware = [
    // 其他中间项...
    'check.username' => \App\Http\Middleware\CheckUsername::class,
];

3. 调整登录后跳转逻辑

修改商家登录控制器(通常是app/Http/Controllers/Auth/VendorLoginController.php),添加redirectTo方法,让用户登录后直接跳转到自己的专属仪表盘:

protected function redirectTo()
{
    $username = auth('vendor')->user()->username;
    return route('vendor.dashboard', ['username' => $username]);
}

4. 控制器优化(可选)

不用依赖路由参数的username,直接通过认证系统获取当前用户更安全,比如VendorController的dashboard方法:

public function dashboard()
{
    $vendor = auth('vendor')->user();
    return view('vendor.dashboard', compact('vendor'));
}

这样就完成了需求:

  • 每个用户对应独立路径http://localhost/project/{username}/dashboard
  • 所有商家路由自动带上{username}前缀,无需逐个添加
  • 避免用户越权访问他人的仪表盘

内容的提问来源于stack exchange,提问作者Samiran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:55:20