如何将Laravel自定义单用户登录升级为按角色跳转的多用户登录系统
Laravel多角色登录跳转实现方案
1. 给用户表添加角色字段
首先在users表中新增role字段,用来存储用户角色(管理员admin、医生doctor、前台receptionist)。可以通过迁移命令实现:
php artisan make:migration add_role_to_users_table
打开生成的迁移文件,修改up方法:
public function up() { Schema::table('users', function (Blueprint $table) { $table->enum('role', ['admin', 'doctor', 'receptionist'])->default('receptionist'); }); }
执行迁移:
php artisan migrate
2. 修改登录逻辑(UserController.php)
登录验证成功后,返回用户角色信息,同时将角色存入session方便后续权限校验:
// handle login user ajax public function loginUser(Request $request){ $validator = Validator::make($request->all(), [ 'email' => 'required|email|max:100', 'password' => 'required|min:8|max:50' ]); if($validator->fails()){ return response()->json([ 'status' => 400, 'messages' => $validator->getMessageBag() ]); }else{ $user = User::where('email', $request->email)->first(); if($user){ if(Hash::check($request->password, $user->password)){ $request->session()->put([ 'loggedInUser' => $user->id, 'userRole' => $user->role ]); return response()->json([ 'status' => 200, 'role' => $user->role ]); } else{ return response()->json([ 'status' => 401, 'messages' => 'E-mail or Password is incorrect!' ]); } } else{ return response()->json([ 'status' => 401, 'messages' => 'User not found!' ]); } } }
3. 修改前端登录页面的Ajax跳转逻辑
在登录成功回调中,根据返回的角色跳转到对应页面:
@section('script') <script> $(function() { $("#login_form").submit(function(e){ e.preventDefault(); $("#login-btn").val('please wait...'); $.ajax ({ url:'{{ route('auth.login')}}', method: 'post', data: $(this).serialize(), dataType: 'json', success: function(res) { if(res.status == 400) { showError('email', res.messages.email); showError('password', res.messages.password); $("#login-btn").val('Login'); } else if(res.status == 401) { $("#login_alert").html(showMessage('danger',res.messages)); $("#login-btn").val('Login'); }else { if(res.status == 200){ switch(res.role){ case 'admin': window.location = '{{ route('admin.dashboard')}}'; break; case 'doctor': window.location = '{{ route('doctor.dashboard')}}'; break; case 'receptionist': window.location = '{{ route('receptionist.dashboard')}}'; break; default: window.location = '{{ route('profile')}}'; } } } } }); }); }); </script> @endsection
4. 添加角色对应的路由
在routes/web.php中添加各角色的首页路由,并应用登录检查中间件:
// 管理员路由 Route::get('/admin/dashboard', [UserController::class, 'adminDashboard'])->name('admin.dashboard')->middleware('LoginCheck'); // 医生路由 Route::get('/doctor/dashboard', [UserController::class, 'doctorDashboard'])->name('doctor.dashboard')->middleware('LoginCheck'); // 前台路由 Route::get('/receptionist/dashboard', [UserController::class, 'receptionistDashboard'])->name('receptionist.dashboard')->middleware('LoginCheck');
5. 在UserController中添加对应角色的页面方法
// 管理员首页 public function adminDashboard(){ return view('admin.dashboard'); } // 医生首页 public function doctorDashboard(){ return view('doctor.dashboard'); } // 前台首页 public function receptionistDashboard(){ return view('receptionist.dashboard'); }
6. 完善中间件(可选:限制角色跨页面访问)
如果需要防止用户通过URL直接访问其他角色的页面,修改LoginCheck.php中间件:
public function handle(Request $request, Closure $next): Response { if(!session()->has('loggedInUser') && ($request->path() != '/login' && $request->path() !='/register')){ return redirect('/login'); } if(session()->has('loggedInUser') && ($request->path() == '/login' || $request->path() =='/register')){ return back(); } // 角色权限校验 if(session()->has('userRole')){ $userRole = session('userRole'); if($userRole == 'admin' && !str_starts_with($request->path(), 'admin/')){ return redirect('/admin/dashboard'); } if($userRole == 'doctor' && !str_starts_with($request->path(), 'doctor/')){ return redirect('/doctor/dashboard'); } if($userRole == 'receptionist' && !str_starts_with($request->path(), 'receptionist/')){ return redirect('/receptionist/dashboard'); } } return $next($request)->header('Cache-Control', 'no-cache, no-store, max-age=0,must-revalidate') ->header('Pragma', 'no-cache')->header('Expires','Sat 01 Jan 1990 00:00:00 GMT'); }
最后创建对应角色的视图文件(如resources/views/admin/dashboard.blade.php),填充页面内容即可。
内容的提问来源于stack exchange,提问作者Cara
相关产品推荐
相关产品推荐

