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键,导致被重定向回登录页。 - 解决方案:
- 使用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; - 确保Dashboard路由的中间件正确:
如果Dashboard需要认证,给路由加上auth中间件:Route::get('dashboard', [AdminController::class, 'dashboard'])->name('dashboard')->middleware('auth'); - 验证CSRF令牌:
确认登录表单中包含CSRF令牌,可通过@csrf指令快速添加,避免请求被Laravel的CSRF防护拦截。 - 调试认证状态:
在Dashboard控制器中添加dd(Auth::check());,查看用户是否真的被认证;或者在登录成功后打印dd($request->session()->all());,确认session是否正确存储。
- 使用Laravel内置认证系统:
内容的提问来源于stack exchange,提问作者Qane
相关产品推荐
相关产品推荐

