Laravel 9中基于一对多关系的多邮箱用户认证实现示例请求
Laravel 多邮箱登录实现示例
1. 修改登录控制器逻辑
Laravel 默认认证仅校验 users 表的 email 字段,我们需要重写登录逻辑,让系统先从关联的 emails 表中匹配邮箱,找到对应用户后再验证密码。
打开 app/Http/Controllers/Auth/LoginController.php,添加/重写以下代码:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Models\Email; class LoginController extends Controller { // 保留原有 Trait 及方法,新增或重写以下内容 /** * 自定义登录校验逻辑 */ protected function attemptLogin(Request $request) { $inputEmail = $request->input('email'); $inputPassword = $request->input('password'); // 先从关联邮箱表查找匹配记录 $emailRecord = Email::where('email', $inputEmail)->first(); if ($emailRecord) { // 通过关联记录获取对应用户,验证密码 $user = $emailRecord->user; if (Auth::guard()->attempt(['id' => $user->id, 'password' => $inputPassword], $request->filled('remember'))) { return true; } } // 兼容原 users 表的邮箱登录逻辑 return Auth::guard()->attempt( $this->credentials($request), $request->filled('remember') ); } /** * 登录参数验证规则 */ protected function validateLogin(Request $request) { $request->validate([ 'email' => 'required|string|email', 'password' => 'required|string', ]); } }
2. 验证逻辑说明
- 系统会优先在
emails表中查找输入的邮箱,找到后关联到对应的User模型 - 通过用户ID匹配,Laravel 会自动用
users表中存储的密码哈希值与输入密码做校验 - 同时保留了原
users表邮箱的登录能力,兼容原有逻辑
3. 可选:邮箱验证增强
由于你的 User 模型实现了 MustVerifyEmail,如果需要强制关联邮箱验证后才能登录,可:
- 给
emails表添加email_verified_at字段 - 在新增关联邮箱时完成邮件验证流程
- 在
attemptLogin方法中添加验证判断:
if ($emailRecord && !is_null($emailRecord->email_verified_at)) { // 后续验证逻辑 }
内容的提问来源于stack exchange,提问作者Mihai
相关产品推荐
相关产品推荐

