You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:15:20