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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:07:00