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

Laravel 8 API中如何实现基于多张用户表的多身份认证

Laravel多用户表API认证实现步骤

以下基于Laravel自带的Sanctum API认证体系实现,全程不需要修改核心逻辑,只需要新增配置和对应业务代码即可。

1. 创建对应模型与迁移

首先生成Student、Teacher两个模型和配套迁移文件,迁移字段可以参考默认的users表,保留name、email、password、remember_token等必要认证字段。
模型需要继承Authenticatable基类,引入Sanctum的token trait:

<?php
namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;
use Illuminate\Notifications\Notifiable;

class Student extends Authenticatable
{
    use HasApiTokens, Notifiable;

    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];
}

Teacher模型和上述代码完全一致,仅修改类名为Teacher即可。

2. 修改认证配置

打开config/auth.php文件,新增自定义看守器(Guard)和用户提供者:

// 看守器配置块
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    // 新增学生认证看守器
    'student' => [
        'driver' => 'sanctum',
        'provider' => 'students',
    ],
    // 新增教师认证看守器
    'teacher' => [
        'driver' => 'sanctum',
        'provider' => 'teachers',
    ],
],

// 用户提供者配置块
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],
    // 新增学生用户提供者,绑定Student模型
    'students' => [
        'driver' => 'eloquent',
        'model' => App\Models\Student::class,
    ],
    // 新增教师用户提供者,绑定Teacher模型
    'teachers' => [
        'driver' => 'eloquent',
        'model' => App\Models\Teacher::class,
    ],
],

配置完成后执行php artisan config:clear清空配置缓存。

3. 实现登录逻辑

登录时指定对应看守器即可自动从对应表校验凭证:

// 学生登录接口逻辑
public function studentLogin(Request $request)
{
    $validated = $request->validate([
        'email' => 'required|email',
        'password' => 'required|string',
    ]);

    // 指定student看守器验证凭证,自动查students表
    if (!Auth::guard('student')->attempt($validated)) {
        return response()->json(['message' => '账号或密码错误'], 401);
    }

    // 验证通过生成接口访问token
    $student = Auth::guard('student')->user();
    $token = $student->createToken('student-auth-token')->plainTextToken;

    return response()->json([
        'user_info' => $student,
        'access_token' => $token
    ]);
}

教师登录逻辑和上述代码完全一致,仅需要将guard参数改为teacher即可。

4. 配置接口鉴权

需要身份校验的路由指定对应看守器中间件即可:

// 仅学生可访问的接口组
Route::middleware('auth:student')->group(function () {
    Route::get('/student/profile', function (Request $request) {
        // 直接获取当前登录的学生实例
        return $request->user();
    });
    // 其他学生接口...
});

// 仅教师可访问的接口组
Route::middleware('auth:teacher')->group(function () {
    Route::get('/teacher/courses', function (Request $request) {
        // 直接获取当前登录的教师实例
        return $request->user();
    });
    // 其他教师接口...
});

5. 退出登录实现

// 学生退出登录
public function studentLogout(Request $request)
{
    // 删除当前请求的token
    $request->user()->currentAccessToken()->delete();
    return response()->json(['message' => '退出登录成功']);
}

注意:如果使用JWT作为API认证方案,仅需要将guard的driver改为jwt即可,整体配置逻辑完全一致。


内容的提问来源于stack exchange,提问作者Zain Amin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:45:02