Laravel 10.32.1实现user与motoboy双表独立认证的方法求助
问题描述
我正在开发一个需要对user和motoboy两类用户进行认证的系统。目前已通过Auth::attempt实现了user表用户的认证,但复用该逻辑进行motoboy用户认证时,系统仍会使用user表进行验证。
希望分别针对user表和motoboy表实现独立的Auth::attempt认证逻辑,请问具体该如何操作?
现有代码
MotoboyController.php
<?php namespace App\Http\Controllers; use App\Models\Motoboy; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; class MotoboyController extends Controller { public function login() { $css = '/assets/css/users/create.css'; $title = 'Motoboy - Login'; return view('motoboys.login', ['css' => $css, 'title' => $title]); } public function auth(Request $request): RedirectResponse { $credentials = $request->validate([ 'email' => ['required', 'email'], 'password' => ['required'], ]); if (Auth::attempt($credentials)) { $request->session()->regenerate(); return redirect()->intended(route('dashboard')); } return back()->withErrors([ 'login' => 'Deu ruim!' ]); } }
Motoboy.php(模型)
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; class Motoboy extends Authenticatable { use HasFactory; protected $table = 'motoboys'; protected $attributes = ['id_status' => 1]; }
解决方案
要实现多表独立认证,只需配置自定义认证守卫即可,无需单独创建认证提供者,Laravel可通过扩展默认Eloquent提供者完成需求。
步骤1:配置认证守卫与提供者
打开config/auth.php,修改guards和providers数组:
return [ // ... 其他原有配置 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 添加motoboy专属守卫 'motoboy' => [ 'driver' => 'session', 'provider' => 'motoboys', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 添加motoboy专属模型提供者 'motoboys' => [ 'driver' => 'eloquent', 'model' => App\Models\Motoboy::class, ], ], // ... 其他原有配置 ];
步骤2:完善Motoboy模型
补充可批量赋值字段(可选但推荐),确保密码字段逻辑正常:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; class Motoboy extends Authenticatable { use HasFactory; protected $table = 'motoboys'; protected $attributes = ['id_status' => 1]; // 根据你的表字段调整可批量赋值的内容 protected $fillable = ['email', 'password', 'name']; // 如果表中密码字段不是默认的`password`,需指定此字段 // protected $passwordAttribute = 'your_custom_password_field'; }
步骤3:修改MotoboyController认证逻辑
指定使用motoboy守卫进行认证:
public function auth(Request $request): RedirectResponse { $credentials = $request->validate([ 'email' => ['required', 'email'], 'password' => ['required'], ]); // 使用motoboy专属守卫执行认证 if (Auth::guard('motoboy')->attempt($credentials)) { $request->session()->regenerate(); // 建议跳转到motoboy专属仪表盘,避免与普通用户路由冲突 return redirect()->intended(route('motoboy.dashboard')); } return back()->withErrors([ 'login' => '邮箱或密码错误!' ]); }
步骤4:配置路由与中间件
给motoboy路由组绑定专属中间件,确保只有认证后的motoboy可访问:
// routes/web.php Route::prefix('motoboy')->name('motoboy.')->group(function () { Route::get('login', [MotoboyController::class, 'login'])->name('login'); Route::post('auth', [MotoboyController::class, 'auth'])->name('auth'); // 需认证才能访问的路由组 Route::middleware('auth:motoboy')->group(function () { Route::get('dashboard', [MotoboyController::class, 'dashboard'])->name('dashboard'); Route::post('logout', [MotoboyController::class, 'logout'])->name('logout'); }); });
步骤5:实现登出逻辑
在MotoboyController中添加登出方法,使用专属守卫清除会话:
public function logout(Request $request): RedirectResponse { Auth::guard('motoboy')->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('motoboy.login'); }
额外注意事项
- 确保
motoboys表中的密码是通过Hash::make()加密存储的,否则认证会失败。 - 视图中获取当前登录的motoboy用户,需使用
Auth::guard('motoboy')->user()。 - 如需自定义认证字段(比如手机号),可修改
attempt的参数:Auth::guard('motoboy')->attempt(['phone' => $credentials['phone'], 'password' => $credentials['password']])
内容的提问来源于stack exchange,提问作者Mateus Rosa
相关产品推荐
相关产品推荐

