Laravel使用存储过程实现登录认证跳转异常,求代码修正
问题诊断与修复方案
你的代码核心问题是:仅通过存储过程验证了用户名密码的正确性,但没有完成Laravel的用户认证流程。Laravel的guest中间件会检查用户是否已通过认证,由于你没有将用户标记为已登录,所以即使凭证正确,依然会被重定向回登录页。
修复步骤
1. 补充用户认证核心逻辑
在验证凭证有效后,需要从数据库中获取对应用户的模型实例,并调用Laravel的认证方法将用户标记为已登录,这样guest中间件才会放行。
2. 修正后的LoginController代码
<?php namespace App\Http\Controllers\Auth; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; use App\Models\User; // 确保引入你的User模型 class LoginController extends Controller { use AuthenticatesUsers; protected $redirectTo = RouteServiceProvider::HOME; public function __construct() { $this->middleware('guest')->except('logout'); } public function login(Request $request) { // 添加表单验证,确保输入合法 $request->validate([ 'username' => 'required|string', 'password' => 'required|string', ]); $username = $request->input('username'); $password = $request->input('password'); // 调用存储过程验证凭证 DB::select('CALL 9_USER_LOGIN(?, ?, @is_valid)', [$username, $password]); $isValid = DB::selectOne('SELECT @is_valid AS is_valid')->is_valid; if ($isValid) { // 获取对应用户的模型实例 $user = User::where('USERNAME', $username)->first(); // 完成Laravel用户认证流程 Auth::login($user); // 优先跳转到用户原本想要访问的页面,无目标页则跳转到首页 return redirect()->intended($this->redirectTo); } else { // 凭证错误,返回登录页并提示 return back()->withErrors([ 'username' => '用户名或密码错误', ]); } } }
3. 关键修改说明
Auth::login($user):这是核心操作,它会将用户信息存入session,让Laravel识别该用户已通过认证,guest中间件就不会再拦截跳转。redirect()->intended():相比直接跳转首页,它会优先跳转到用户触发认证前想要访问的页面,更符合常规认证逻辑。- 表单验证:添加
$request->validate()确保输入符合要求,同时自动将错误信息返回至视图。
重要安全提醒
你的存储过程中直接对比明文密码,属于高危操作。正确的做法是:
- 用户注册时,使用Laravel的
Hash::make($password)对密码进行哈希存储。 - 验证密码时,在代码中用
Hash::check($password, $user->PASSWORD)进行验证(不推荐在存储过程中处理哈希验证,避免算法不一致问题)。
内容的提问来源于stack exchange,提问作者Nasya
相关产品推荐
相关产品推荐

