Laravel/ui最新版:登录时如何根据用户角色跳转对应页面
Laravel UI 登录后按角色跳转实现方案
前提准备
确保你的User模型包含role字段(字符串类型,存储值为admin或users),可通过迁移文件添加该字段。
实现方式一:重写redirectTo闭包
打开app/Http/Controllers/Auth/LoginController.php,修改控制器代码:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; class LoginController extends Controller { use AuthenticatesUsers; // 重写redirectTo为闭包,动态判断跳转地址 protected $redirectTo = function () { $user = auth()->user(); return $user->role === 'admin' ? '/admin/dashboard' : '/home'; }; public function __construct() { $this->middleware('guest')->except('logout'); } }
实现方式二:重写authenticated方法
同样在LoginController中,重写authenticated方法,支持跳转至用户之前尝试访问的页面(intended方法):
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; class LoginController extends Controller { use AuthenticatesUsers; protected $redirectTo = '/home'; public function __construct() { $this->middleware('guest')->except('logout'); } protected function authenticated(Request $request, $user) { $redirectUrl = $user->role === 'admin' ? '/admin/dashboard' : '/home'; return redirect()->intended($redirectUrl); } }
可选:添加角色权限控制中间件
为防止普通用户直接访问管理页面,可创建角色验证中间件:
- 创建中间件文件
app/Http/Middleware/RoleMiddleware.php:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class RoleMiddleware { public function handle($request, Closure $next, $role) { if (!Auth::check() || Auth::user()->role !== $role) { abort(403, '无访问权限'); } return $next($request); } }
- 在
app/Http/Kernel.php中注册中间件别名:
protected $routeMiddleware = [ // ... 其他中间件 'role' => \App\Http\Middleware\RoleMiddleware::class, ];
- 给路由添加中间件验证:
// routes/web.php use App\Http\Controllers\AdminController; use App\Http\Controllers\HomeController; // 管理员路由组 Route::middleware(['auth', 'role:admin'])->group(function () { Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard'); }); // 普通用户路由组 Route::middleware('auth')->group(function () { Route::get('/home', [HomeController::class, 'index'])->name('home'); });
内容的提问来源于stack exchange,提问作者Nguyễn Xuân Ngọc
相关产品推荐
相关产品推荐

