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
相关产品推荐
相关产品推荐

