
laravel 默认的认证系统主要通过 config/auth.php 文件进行配置,它由两个核心组件构成:
当我们需要从多个数据表(例如 users、students、teachers)中认证不同类型的用户时,就需要扩展这些默认配置,为每种用户类型创建独立的守卫和提供者。
首先,确保你的不同用户类型都有对应的 Eloquent 模型,并且这些模型都实现了 Illuminate\Contracts\Auth\Authenticatable 接口。对于 Laravel 8 及更高版本,你可以让你的模型继承 Illuminate\Foundation\Auth\User 类,因为它已经实现了该接口。
例如,如果你有 Student 和 Teacher 表,你需要创建对应的模型:
// app/Models/Student.php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens; // 如果使用 Sanctum 进行 API 认证
class Student extends Authenticatable
{
use Notifiable, HasApiTokens; // 引入 HasApiTokens
protected $table = 'students'; // 确保指向正确的表名
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
}类似地,为 Teacher 模型进行配置。
// app/Models/Teacher.php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class Teacher extends Authenticatable
{
use Notifiable, HasApiTokens;
protected $table = 'teachers'; // 确保指向正确的表名
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
}接下来,修改 config/auth.php 文件,为每种用户类型定义新的提供者和守卫。
定义提供者 (Providers): 在 providers 数组中,为 students 和 teachers 添加新的提供者。
// config/auth.php
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'students' => [ // 新增学生提供者
'driver' => 'eloquent',
'model' => App\Models\Student::class,
],
'teachers' => [ // 新增教师提供者
'driver' => 'eloquent',
'model' => App\Models\Teacher::class,
],
],定义守卫 (Guards): 在 guards 数组中,为每种用户类型定义一个 API 守卫。这里以 sanctum 驱动为例,如果你使用 Passport 或其他 JWT 方案,请相应调整 driver。
// config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [ // 默认API守卫,可根据需要调整
'driver' => 'sanctum',
'provider' => 'users',
],
'student_api' => [ // 学生API守卫
'driver' => 'sanctum', // 或者 'token' / 'passport'
'provider' => 'students', // 使用上面定义的学生提供者
],
'teacher_api' => [ // 教师API守卫
'driver' => 'sanctum', // 或者 'token' / 'passport'
'provider' => 'teachers', // 使用上面定义的教师提供者
],
],现在你可以在控制器中根据不同的守卫来认证用户。
示例:学生登录控制器
// app/Http/Controllers/Api/StudentAuthController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class StudentAuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
// 尝试使用 'student_api' 守卫进行认证
if (Auth::guard('student_api')->attempt($credentials)) {
$student = Auth::guard('student_api')->user();
// 生成 API Token (如果使用 Laravel Sanctum)
$token = $student->createToken('student-api-token')->plainTextToken;
return response()->json([
'message' => 'Student logged in successfully.',
'token' => $token,
'student' => $student,
], 200);
}
return response()->json(['message' => 'Invalid student credentials.'], 401);
}
public function logout(Request $request)
{
// 撤销当前守卫下的所有令牌
Auth::guard('student_api')->user()->tokens()->delete();
return response()->json(['message' => 'Student logged out successfully.'], 200);
}
public function me()
{
// 获取当前认证的学生用户
return response()->json(Auth::guard('student_api')->user());
}
}示例:教师登录控制器
类似地,为教师创建一个 TeacherAuthController,并使用 Auth::guard('teacher_api')->attempt($credentials) 进行认证。
在 routes/api.php 文件中定义你的认证路由和受保护路由。
// routes/api.php
use App\Http\Controllers\Api\StudentAuthController;
use App\Http\Controllers\Api\TeacherAuthController;
// 学生认证路由
Route::post('/student/login', [StudentAuthController::class, 'login']);
// 教师认证路由
Route::post('/teacher/login', [TeacherAuthController::class, 'login']);
// 受学生守卫保护的路由
Route::middleware('auth:student_api')->group(function () {
Route::get('/student/me', [StudentAuthController::class, 'me']);
Route::post('/student/logout', [StudentAuthController::class, 'logout']);
// 其他学生专属API
});
// 受教师守卫保护的路由
Route::middleware('auth:teacher_api')->group(function () {
Route::get('/teacher/me', [TeacherAuthController::class, 'me']);
Route::post('/teacher/logout', [TeacherAuthController::class, 'logout']);
// 其他教师专属API
});注意 auth:student_api 和 auth:teacher_api 中间件的使用,它指示 Laravel 使用特定的守卫来验证请求。
通过为不同用户类型定义独立的认证守卫和提供者,Laravel 提供了一个强大且灵活的机制来实现多表用户认证。这种方法不仅清晰地分离了不同用户群体的认证逻辑,也使得权限管理和API访问控制更加精细化。理解并正确配置 config/auth.php 是实现这一目标的关键,结合适当的认证驱动(如 Sanctum)和路由中间件,你可以为复杂的应用构建健壮的多用户认证系统。
以上就是在 Laravel 8 API 中实现多表用户认证的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号