Laravel 8多认证中,学生端以手机号为密码登录失败的解决求助
Laravel 8 多认证学生端登录问题解决
问题核心原因
你当前使用的 Auth::attempt() 方法是为哈希密码验证设计的,它会自动对输入的password值做哈希处理,再和模型返回的字段对比。但你的学生登录逻辑是用明文存储的mobile_no作为凭证,哈希后的输入值永远和明文手机号不匹配,导致验证失败。
解决方案:手动验证+登录
直接绕过默认的哈希验证逻辑,手动查询学生记录并完成登录:
1. 修改 LoginController 的登录逻辑
替换原有的webstudent守卫attempt验证代码:
public function postLogin(Request $request) { $request->validate([ 'email' => 'required', 'password' => 'required', ]); // 管理员登录(保留原有逻辑) if(Auth::guard('web')->attempt(['email' => $request->email, 'password' => $request->password])) { return redirect()->route('admin.dashboard'); } // 学生登录:手动查询匹配记录 $student = \App\Models\Student::where('email_id', $request->email) ->where('mobile_no', $request->password) ->first(); if ($student) { // 手动登录学生账号 Auth::guard('webstudent')->login($student); return redirect()->route('student.dashboard'); } // 登录失败返回 return redirect()->route('login')->with(['error'=>'Login details are not valid']); }
2. 移除无用代码
删除Student模型中重写的getAuthPassword()方法,因为现在不需要依赖Laravel的默认密码验证机制。
3. 可选:优化验证规则
如果学生登录的"密码"是手机号,可以针对性调整验证规则,提升体验:
$request->validate([ 'email' => 'required|email', // 若email_id是邮箱格式 'password' => 'required|numeric|digits:11', // 适配11位手机号格式 ]);
内容的提问来源于stack exchange,提问作者sam orten
相关产品推荐
相关产品推荐

