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
相关产品推荐
相关产品推荐

