Laravel 8 API 多表用户认证:实现多Guard策略

Laravel 8 API 多表用户认证:实现多Guard策略

本教程旨在解决Laravel 8 API中如何对存储在不同数据库表中的多种用户类型(如学生、教师)进行认证的问题。我们将深入探讨Laravel灵活的认证机制,通过配置多Guards和Providers,实现对不同用户模型进行独立且安全的API认证,并提供详细的配置与代码示例。

理解Laravel认证核心:Guards与Providers

laravel中,认证机制的核心是guards(守卫)和providers(提供者)。

Guards 负责定义用户如何被认证和存储(例如,通过session、token、JWT等)。它决定了用户登录后如何保持认证状态。Providers 负责从持久化存储(通常是数据库)中检索用户数据。它定义了如何根据用户ID或凭据(如邮箱和密码)找到对应的用户记录。

默认情况下,Laravel提供一个名为web的Guard(使用session驱动)和一个名为api的Guard(通常使用token驱动,如Sanctum或Passport),它们都使用一个名为users的Provider,该Provider指向AppModelsUser模型。当我们需要从多个表认证用户时,就需要扩展这一机制。

实现多表用户认证的步骤

要实现对users、students和teachers等多表用户的认证,我们需要为每种用户类型定义独立的Provider,并为API认证定义相应的Guard。

1. 创建用户模型并实现Authenticatable接口

首先,确保你的Student和Teacher模型存在,并且它们都实现了IlluminateContractsAuthAuthenticatable接口。Laravel的User模型默认已经实现了这个接口,你只需让你的自定义用户模型继承IlluminateFoundationAuthUser即可,因为它已经实现了该接口。

// app/Models/Student.phpnamespace AppModels;use IlluminateFoundationAuthUser as Authenticatable;use IlluminateNotificationsNotifiable;use LaravelSanctumHasApiTokens; // 如果使用Sanctum进行API认证class Student extends Authenticatable{    use HasApiTokens, Notifiable;    protected $fillable = [        'name', 'email', 'password',    ];    protected $hidden = [        'password', 'remember_token',    ];    protected $casts = [        'email_verified_at' => 'datetime',    ];}// app/Models/Teacher.phpnamespace AppModels;use IlluminateFoundationAuthUser as Authenticatable;use IlluminateNotificationsNotifiable;use LaravelSanctumHasApiTokens; // 如果使用Sanctum进行API认证class Teacher extends Authenticatable{    use HasApiTokens, Notifiable;    protected $fillable = [        'name', 'email', 'password',    ];    protected $hidden = [        'password', 'remember_token',    ];    protected $casts = [        'email_verified_at' => 'datetime',    ];}

2. 配置认证Guards和Providers

修改config/auth.php文件,添加新的Provider和Guard。

定义Providers:在providers数组中,为students和teachers添加新的Eloquent provider,指向各自的模型。

// config/auth.php'providers' => [    'users' => [        'driver' => 'eloquent',        'model' => AppModelsUser::class,    ],    'students' => [ // 新增学生Provider        'driver' => 'eloquent',        'model' => AppModelsStudent::class,    ],    'teachers' => [ // 新增教师Provider        'driver' => 'eloquent',        'model' => AppModelsTeacher::class,    ],],

定义Guards:在guards数组中,为每种用户类型定义一个API Guard。这里我们使用sanctum驱动,它是Laravel 8推荐的API认证方式。每个Guard需要指定其使用的provider。

// config/auth.php'guards' => [    'web' => [        'driver' => 'session',        'provider' => 'users',    ],    'api' => [ // 默认API Guard,可继续使用或为特定用户类型保留        'driver' => 'sanctum',        'provider' => 'users',    ],    'api_student' => [ // 新增学生API Guard        'driver' => 'sanctum',        'provider' => 'students',    ],    'api_teacher' => [ // 新增教师API Guard        'driver' => 'sanctum',        'provider' => 'teachers',    ],],

3. 实现API认证逻辑

现在,你可以在你的控制器中根据用户类型调用相应的Guard进行认证。

登录控制器示例:

假设你有一个AuthController来处理不同用户类型的登录。

// app/Http/Controllers/Api/AuthController.phpnamespace AppHttpControllersApi;use AppHttpControllersController;use IlluminateHttpRequest;use IlluminateSupportFacadesAuth;use IlluminateValidationValidationException;class AuthController extends Controller{    /**     * 学生登录     *     * @param  IlluminateHttpRequest  $request     * @return IlluminateHttpJsonResponse     * @throws IlluminateValidationValidationException     */    public function studentLogin(Request $request)    {        $request->validate([            'email' => ['required', 'string', 'email'],            'password' => ['required', 'string'],        ]);        if (! Auth::guard('api_student')->attempt($request->only('email', 'password'))) {            throw ValidationException::withMessages([                'email' => [__('auth.failed')],            ]);        }        $student = Auth::guard('api_student')->user();        $token = $student->createToken('student-auth-token')->plainTextToken;        return response()->json(['token' => $token, 'student' => $student]);    }    /**     * 教师登录     *     * @param  IlluminateHttpRequest  $request     * @return IlluminateHttpJsonResponse     * @throws IlluminateValidationValidationException     */    public function teacherLogin(Request $request)    {        $request->validate([            'email' => ['required', 'string', 'email'],            'password' => ['required', 'string'],        ]);        if (! Auth::guard('api_teacher')->attempt($request->only('email', 'password'))) {            throw ValidationException::withMessages([                'email' => [__('auth.failed')],            ]);        }        $teacher = Auth::guard('api_teacher')->user();        $token = $teacher->createToken('teacher-auth-token')->plainTextToken;        return response()->json(['token' => $token, 'teacher' => $teacher]);    }    /**     * 退出登录 (学生)     *     * @param  IlluminateHttpRequest  $request     * @return IlluminateHttpJsonResponse     */    public function studentLogout(Request $request)    {        // 确保当前认证用户是学生        if (Auth::guard('api_student')->check()) {            $request->user('api_student')->currentAccessToken()->delete();            return response()->json(['message' => 'Logged out successfully for student.']);        }        return response()->json(['message' => 'Not authenticated as student.'], 401);    }    /**     * 退出登录 (教师)     *     * @param  IlluminateHttpRequest  $request     * @return IlluminateHttpJsonResponse     */    public function teacherLogout(Request $request)    {        // 确保当前认证用户是教师        if (Auth::guard('api_teacher')->check()) {            $request->user('api_teacher')->currentAccessToken()->delete();            return response()->json(['message' => 'Logged out successfully for teacher.']);        }        return response()->json(['message' => 'Not authenticated as teacher.'], 401);    }}

4. 定义API路由并使用中间件保护

在routes/api.php中定义路由,并使用相应的Guard中间件来保护它们。

// routes/api.phpuse AppHttpControllersApiAuthController;use IlluminateSupportFacadesRoute;// 学生认证路由Route::post('/student/login', [AuthController::class, 'studentLogin']);Route::middleware('auth:api_student')->group(function () {    Route::get('/student/profile', function (Request $request) {        return $request->user('api_student');    });    Route::post('/student/logout', [AuthController::class, 'studentLogout']);});// 教师认证路由Route::post('/teacher/login', [AuthController::class, 'teacherLogin']);Route::middleware('auth:api_teacher')->group(function () {    Route::get('/teacher/profile', function (Request $request) {        return $request->user('api_teacher');    });    Route::post('/teacher/logout', [AuthController::class, 'teacherLogout']);});// 默认用户认证路由 (如果仍然需要)Route::post('/user/login', [AuthController::class, 'userLogin']); // 假设你也有一个userLogin方法Route::middleware('auth:api')->group(function () {    Route::get('/user/profile', function (Request $request) {        return $request->user(); // 默认使用'api' guard    });});

注意: 在middleware(‘auth:api_student’)中,api_student是你在config/auth.php中定义的Guard名称。

注意事项

选择合适的API认证驱动: 本教程示例使用了Laravel Sanctum,它是一个轻量级的API认证包,适用于SPA、移动应用和简单的API token认证。如果你需要更强大的OAuth2功能,可以考虑使用Laravel Passport。模型必须实现Authenticatable: 确保所有需要认证的用户模型都继承了IlluminateFoundationAuthUser或手动实现了IlluminateContractsAuthAuthenticatable接口。密码哈希: 在将用户密码存入数据库之前,务必使用bcrypt()或其他安全的哈希算法进行哈希处理。Laravel的User模型通常会在创建时自动处理。错误处理: 在认证失败时,提供清晰的错误信息,避免暴露过多内部细节。前端交互: 客户端在登录成功后应保存返回的API token,并在后续请求中通过Authorization: Bearer {token}头发送该token。

总结

通过灵活配置Laravel的Guards和Providers,我们可以轻松地实现对存储在不同数据库表中的多种用户类型进行独立的API认证。这种方法不仅保持了代码的清晰和可维护性,也充分利用了Laravel强大的认证系统,为构建复杂的应用提供了坚实的基础。理解Guards和Providers的工作原理是掌握Laravel认证机制的关键,能够帮助开发者应对各种复杂的认证场景。

以上就是Laravel 8 API 多表用户认证:实现多Guard策略的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/17663.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Windows 11磁盘分区详细指南
上一篇 2025年12月3日 05:30:35
《DNF手游》首日流水预估3亿,腾讯又一年收入百亿爆款成了?!
下一篇 2025年12月3日 05:30:40

相关推荐

  • mac怎么撤销已发送的信息_Mac撤销已发送信息方法

    答案:Mac上可通过“信息”应用在2分钟内撤回或编辑iMessage消息。操作步骤:1. 悬停消息气泡点击“…”;2. 选择“撤回”或“编辑”;3. 编辑最多5次,超限仅可撤回,对方消息同步删除。 如果您在Mac上使用信息应用发送了消息,但发现内容有误或需要撤回,可以在一定时间内执行撤销操作。此功能…

    2026年9月21日
    000
  • Word中如何快速截图?

    Word中如何快速截图?Word中如何快速截图?Word中如何快速截图?Word中如何快速截图?

    打开word文档,选择顶部菜单栏中的“插入”功能。 1、 选择后下方会显示相关选项,直接点击所需项即可完成操作。 2、 点击后进入选择界面,选取对应功能进行下一步。 3、 此时可以看到,所截取的图片已自动添加至Word文档中。 以上就是Word中如何快速截图?的详细内容,更多请关注创想鸟其它相关文章…

    2026年9月21日 用户投稿
    000
  • Windows系统下的兼容性问题

    windows兼容性问题严重是因为系统演进快、硬件和软件环境多样。处理此问题需:1.了解目标系统版本和配置;2.使用低版本api或兼容性模式;3.检测操作系统版本并调整程序行为;4.避免依赖特定版本的库,提供多版本安装包;5.考虑硬件依赖性,提供备选方案;6.进行跨版本性能测试和优化。 在Windo…

    2026年9月21日
    000
  • Linux如何限制用户执行特定命令

    Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令

    首选sudo进行命令限制,因其灵活且可审计;通过visudo配置精确的用户权限,结合白名单、命令别名和!语法实现允许或拒绝特定命令;同时防范绕过手段如全路径执行、间接调用、脚本执行等,需多层防御并辅以日志监控。 在Linux环境中,限制用户执行特定命令,最直接有效且灵活的方法通常是利用 sudo 权…

    2026年9月21日 用户投稿
    000
  • 猎豹浏览器最新官方网址链接 猎豹浏览器平台入口直达官网首页

    猎豹浏览器最新官方网址是http://m.liebao.cn/,该网站提供安卓和iPhone版浏览器下载,具备双引擎加速、视频缓存、安全防护及个性化设置等功能。 猎豹浏览器最新官方网址链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来猎豹浏览器平台入口直达官网首页,感兴趣的网友一起随小编…

    2026年9月21日
    000
  • 豆包大模型1.6 lite— 字节跳动推出的轻量级AI模型

    豆包大模型1.6 lite— 字节跳动推出的轻量级AI模型豆包大模型1.6 lite— 字节跳动推出的轻量级AI模型豆包大模型1.6 lite— 字节跳动推出的轻量级AI模型豆包大模型1.6 lite— 字节跳动推出的轻量级AI模型

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 豆包大模型 字节跳动自主研发的一系列大型语言模型 834 查看详情 豆包大模型1.6 lite是什么 豆包大模型1.6 lite(doubao-seed-1.6-lite)是字节跳动推出的轻量级…

    2026年9月21日 用户投稿
    300
  • mysql如何使用事务保证操作原子性

    答案:MySQL中事务通过START TRANSACTION开启,需使用InnoDB引擎并关闭自动提交,执行SQL后根据结果COMMIT或ROLLBACK,结合异常处理确保原子性。 在MySQL中,事务是保证数据库操作原子性的核心机制。通过事务,可以确保一组SQL操作要么全部成功执行,要么全部不执行…

    2026年9月21日
    500
  • 百度AI开发者大会何时举行_百度AI开发者大会参与指南

    2025百度AI开发者大会于4月25日在武汉体育中心举办,主题为“模型的世界,应用的天下”,发布了两大模型及多款AI应用,参会需通过官网注册报名,审核后获取电子凭证,同时提供线上直播及会后视频回看。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜…

    2026年9月21日
    000
  • 抖音商城是哪个公司在运营

    抖音商城的运营主体揭晓 抖音商城由北京微播视界科技有限公司负责运营。 作为抖音背后的母公司,字节跳动通过其全资子公司——微播视界,全面掌舵抖音平台及其电商板块的日常运作。依托雄厚的技术积累与多元化的业务布局,为用户打造流畅、智能且高效的购物环境。 抖音商城究竟是什么? 抖音商城是抖音App内嵌的一站…

    2026年9月21日
    100
  • mysql如何理解索引选择性

    索引选择性是衡量索引效率的关键指标,定义为索引列不同值数量与总行数的比值,范围在0到1之间。越接近1,数据唯一性越高,索引过滤能力越强,查询性能越好。例如主键列选择性为1,而性别列因重复值多选择性极低。MySQL优化器会优先选择高选择性索引以缩小搜索范围,提高执行效率。可通过SELECT COUNT…

    2026年9月21日
    000
  • iPhone 17如何快速清理存储空间

    首先通过系统推荐一键优化释放8-12GB空间,再重点清理微信缓存、合并重复照片并开启优化存储,最后深度清理Safari缓存、删除大型App及关闭自动下载,可高效腾出数十GB存储。 虽然目前还没有iPhone 17,但根据2025年最新的iOS系统清理方法,无论你使用的是哪款iPhone,都可以通过以…

    2026年9月21日
    100
  • 卖不动!iPhone Air暂时停产!库存已经够用了

    据数码博主“定焦数码”透露,苹果iphone air目前已暂停生产。此次调整主要受两方面因素影响:一是该机型在海外市场销量未达预期;二是中国大陆地区的上市时间有所推迟。不过,由于前期已储备了充足的整机库存,当前市场供应不受影响,未来将根据订单积累情况再决定恢复生产的时机。 这一产能变动与此前投资机构…

    2026年9月21日
    000
  • ThinkPHP生产环境部署的注意事项

    在生产环境中部署thinkphp应用需要注意以下几点:1.确保服务器环境满足thinkphp要求,使用php 7.2+和支持的web服务器;2.配置php.ini和application/config.php文件,关闭调试模式,设置合适的日志级别和数据库连接;3.采取安全措施,保护应用目录结构,使用…

    2026年9月21日
    100
  • 豆包语音2.0— 字节跳动推出的升级版AI语音模型

    豆包语音2.0是什么 豆包语音2.0是字节跳动推出的升级版ai语音模型,包含两大核心模型:豆包语音合成模型2.0(doubao-seed-tts 2.0)和豆包声音复刻模型2.0(doubao-seed-icl 2.0)。语音合成模型2.0支持对话式合成,可精准理解语义和情感,实现复杂公式朗读,准确…

    2026年9月21日
    100
  • Java中如何将嵌套列表对象转换为扁平化单元素列表

    本文探讨了在java中将包含嵌套列表的对象集合转换为新列表的多种策略,旨在使新列表中每个对象仅包含其嵌套列表中的一个元素。通过详细介绍java 7的传统迭代方法、java 8-15的stream api `flatmap`操作,以及java 16及更高版本的`mapmulti`方法,文章提供了清晰的…

    2026年9月21日
    100
  • 如何为VSCode安装新的字体?

    先在操作系统安装字体文件,再在VSCode设置中指定字体名称。1. Windows右键安装.ttf/.otf文件,macOS用字体册安装,Linux复制到~/.fonts并运行fc-cache -fv;2. VSCode中通过设置界面或编辑settings.json修改”editor.f…

    2026年9月21日
    000
  • 如何制作抖音点单小程序:全面指南与实用技巧

    引言: 随着移动互联网的飞速发展,抖音已不仅仅是短视频平台,更成为商家连接用户的重要入口。越来越多企业开始关注抖音点单小程序的搭建,以提升服务效率和用户体验。本文将为您系统讲解抖音点单小程序的制作流程,并分享实用技巧与真实案例,助您快速打造专属的小程序,实现流量变现与销售增长。 1. 明确核心需求与…

    2026年9月21日
    200
  • mysql如何配置ssl安全连接

    MySQL支持SSL时返回YES,通过生成证书并配置my.cnf中的ssl-ca、ssl-cert、ssl-key启用SSL,创建REQUIRE SSL用户确保加密连接,客户端连接需指定证书参数,STATUS或Ssl_cipher验证加密状态。 MySQL 配置 SSL 安全连接可以提升数据库通信的…

    2026年9月21日
    200
  • 如何模拟用户登录状态进行测试?

    模拟用户登录状态是为了测试系统功能和安全性。1.在开发初期帮助发现和修复问题。2.测试不同用户权限下的功能访问。方法包括:1.直接操作session或cookie。2.使用测试框架如junit或testng。3.模拟api请求。 模拟用户登录状态进行测试是确保软件系统用户体验和安全性的关键步骤。无论…

    2026年9月21日
    300
  • iPhone SE 2022常见发热原因及处理方法 科普指南

    iPhone SE 2022 发热主因包括高性能任务、边充边用、高温环境、厚手机壳、后台程序及电池老化;正常使用下发热属常见现象,通过停止高耗能操作、移至阴凉处、取下手机壳、开启低电量模式可快速降温;长期建议避免边充边玩、选用轻薄壳、定期清理系统、更新 iOS 及检查电池健康,若待机过热或有鼓包异味…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信