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

Laravel登录后无法跳转至Dashboard问题求助

问题:Laravel 10 AJAX登录成功后无法跳转至Dashboard,反而重定向回登录页

我是Laravel新手,在Laravel 10中使用AJAX实现登录验证。目前遇到的问题是:登录凭证错误时,验证功能正常生效;但使用正确凭证登录后,页面没有跳转到Dashboard,反而重定向回了登录页面。

控制器代码

public function loginUser(Request $request){
    $validator = Validator::make($request->all(), [
        'username' => 'required|max:50',
        'password' => 'required|min:6|max:100'

    ]);

    if($validator->fails()){
        return response()->json([
            'status' => 400,
            'messages' => $validator->getMessageBag()
        ]);
    }else{
        $user = User::where('username', $request->username)->first();
        if($user){
            if(Hash::check($request->password, $user->password)){
                $request->session()->put('loggedInUser', $user->id);
                return response()->json([
                    'status' => 200,
                    'messages' => 'success'
                ]);

            } else{
                return response()->json([
                    'status' => 401,
                    'messages' => 'Username or password is incorrect!'
                ]);
            }
        } else{
            return response()->json([
                'status' => 401,
                'messages' => 'Uername not found!'
            ]);
        }
    }
}

路由代码

Route::controller(AdminController::class)->group(function() {
    Route::post('auth.register', 'saveUser')->name('auth.register');
    Route::post('auth.login', 'loginUser')->name('auth.login');
});

Blade页面代码

<script>
    $(function(){
        $("#loginForm").submit(function(e){
            e.preventDefault();
            $("#loginBtn").val('Please wait...');
            $.ajax({
                url: '{{ route('auth.login') }}',
                method: 'post',
                data: $(this).serialize(),
                dataType: 'json',
                success: function(res){
                    if(res.status == 400){
                        showError('username', res.messages.username);
                        showError('password', res.messages.password);
                        $("#loginBtn").val('Login');
                    } else if(res.status == 401){
                        $("#login_alert").html(showMessage('danger', res.messages));
                        $("#loginBtn").val('Login');
                    } else {
                        if(res.status == 200 && res.messages == 'success'){
                            window.location = '{{ route('dashboard') }}';
                        }
                    }
                }
            });
        });
    });
</script>

问题分析与解决方法

  • 核心原因:你通过$request->session()->put('loggedInUser', $user->id)手动存储登录状态,但Dashboard路由可能未正确校验该自定义session,或者Laravel默认的auth中间件不识别这个session键,导致被重定向回登录页。
  • 解决方案:
    1. 使用Laravel内置认证系统:
      替换控制器中登录成功的代码,用Laravel官方的Auth类处理登录:
      // 移除 $request->session()->put('loggedInUser', $user->id);
      Auth::login($user); // 内置Auth类完成用户登录
      return response()->json([
          'status' => 200,
          'messages' => 'success'
      ]);
      
      记得在控制器顶部引入:use Illuminate\Support\Facades\Auth;
    2. 确保Dashboard路由的中间件正确:
      如果Dashboard需要认证,给路由加上auth中间件:
      Route::get('dashboard', [AdminController::class, 'dashboard'])->name('dashboard')->middleware('auth');
      
    3. 验证CSRF令牌:
      确认登录表单中包含CSRF令牌,可通过@csrf指令快速添加,避免请求被Laravel的CSRF防护拦截。
    4. 调试认证状态:
      在Dashboard控制器中添加dd(Auth::check());,查看用户是否真的被认证;或者在登录成功后打印dd($request->session()->all());,确认session是否正确存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:31:11