Laravel Auth 调用 tymon/jwt-auth 源码分析

版本

  • "tymon/jwt-auth": "1.0.0-rc.1"
  • "laravel/framework": "5.5.*"

tymon/jwt 的使用

这里省略安装步骤,直接写使用过程

  1. auth.php
'api' => ['driver' => 'jwt','provider' => 'users',
],
  1. 路由调用
Route::middleware(['auth:api'])->group(function(){
});

Auth 中间件是如何调用 Guard

在请求通过路由时执行中间件,auth 中间件实例化的是 Illuminate\Auth\Middleware\Authenticate 类:

<?phpnamespace Illuminate\Auth\Middleware;use Closure;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Contracts\Auth\Factory as Auth;class Authenticate
{/*** The authentication factory instance.** @var \Illuminate\Contracts\Auth\Factory*/protected $auth;/*** Create a new middleware instance.** @param  \Illuminate\Contracts\Auth\Factory  $auth* @return void*/public function __construct(Auth $auth){$this->auth = $auth;}/*** Handle an incoming request.** @param  \Illuminate\Http\Request  $request* @param  \Closure  $next* @param  string[]  ...$guards* @return mixed** @throws \Illuminate\Auth\AuthenticationException*/public function handle($request, Closure $next, ...$guards){$this->authenticate($guards);return $next($request);}/*** Determine if the user is logged in to any of the given guards.** @param  array  $guards* @return void** @throws \Illuminate\Auth\AuthenticationException*/protected function authenticate(array $guards){if (empty($guards)) {return $this->auth->authenticate();}foreach ($guards as $guard) {if ($this->auth->guard($guard)->check()) {return $this->auth->shouldUse($guard);}}throw new AuthenticationException('Unauthenticated.', $guards);}
}

请求过来后使用了中间件,会调用 handle 方法
所以我们看到 authenticate 方法中,会循环调用 guardcheck 方法,成功会返回 auth 实例,失败则统一抛出 AuthenticationException

namespace Illuminate\Auth;use Exception;class AuthenticationException extends Exception
{/*** All of the guards that were checked.** @var array*/protected $guards;/*** Create a new authentication exception.** @param  string  $message* @param  array  $guards* @return void*/public function __construct($message = 'Unauthenticated.', array $guards = []){parent::__construct($message);$this->guards = $guards;}/*** Get the guards that were checked.** @return array*/public function guards(){return $this->guards;}
}

可以在 App\Exceptions\Handler 中的 unauthenticated() 捕获该异常,这也是为什么不管是 token 过期还是拉黑,使用 auth 中间件的错误提示一直是 Unauthenticated. 的原因!

为什么使用 auth:jwtGuard 的方式

因为 jwt.auth 不能指定 guard ,只会调用默认的 guard ,当你的 default 指向 web 时,会导致一直未认证。
解决办法:

  1. 定义中间件,每次调用 jwt.auth 前,都把默认的 guard 指定为你当前路由适用的 guard
  2. 使用 auth:jwtGuard 的调用方式,如 auth:apiapiguard driver 选择 jwt ,这样在错误信息返回时就没有具体原因了,都是统一的 Unauthenticated.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sheng的学习笔记-hive框架原理

需要学习的前置知识&#xff1a;hadoop 可参考 sheng的学习笔记-hadoop-CSDN博客 相关网址 官网&#xff1a;http://hive.apache.org 文档&#xff1a;https://cwiki.apache.org/confluence/display/Hive/GettingStarted https://cwiki.apache.org/confluence/display/Hive/…

react 重新加载子组件

在React中&#xff0c;要重新加载某个子组件&#xff0c;你可以通过改变该组件的key属性来强制它重新渲染。这是因为React会在key变化时销毁旧的组件实例并创建一个新的实例。 多的不说直接上代码 import React, { useState } from react; import ChildComponent from ../chil…

Sermant自定义插件开发上手体验

作者&#xff1a;用友汽车信息科技&#xff08;上海&#xff09;有限公司 刘亚洲 Java研发工程师 一、研究缘由 由于目前我们所处的行业是汽车行业&#xff0c;项目上进行云服务的迁移时使用到了Sermant中的相关插件, 为了加深对Sermant开发和运行机制的了解&#xff0c;我…

线程、线程池与CompletableFuture线程编排

线程、线程池与CompletableFuture线程编排 1. 多线程的初始化方式1.1 简单实现多线程的启动方式(3种)1. 继承Thread实现2. 实现Runnable接口3. 实现callable接口(返回值)2. 基于线程池实现多线程的启动方式❤❤❤2.1 线程池创建与使用2.2 SpringBoot自定义线程池组件 ❤ ❤3. 多…

如何屏幕录制?这3款软件轻松实现!

随着科技的不断发展&#xff0c;屏幕录制成为了人们日常生活中越来越常见的需求。无论是录制游戏过程、分享教程、还是保存重要的在线会议&#xff0c;屏幕录制都是一个非常实用的工具。然而&#xff0c;很多用户却不知道如何屏幕录制。本文将详细介绍3款屏幕录制软件&#xff…

如何在Java中处理SSLHandshakeException异常?

如何在Java中处理SSLHandshakeException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; SSLHandshakeException异常是Java中常见的网络安全异…

使用Python进行视频处理:轻松制作影片

哈喽,大家好,我是木头左! 本文将介绍如何使用Python进行视频处理,帮助您轻松制作出令人惊叹的专业级影片。 安装必要的库 在进行视频处理之前,需要安装一些必要的库和模块。其中最常用的是OpenCV和FFmpeg。OpenCV是一个强大的计算机视觉库,可以用于图像和视频处理。FFmp…

《梦醒蝶飞:释放Excel函数与公式的力量》7.3 RIGHT函数

第七章&#xff1a;文本处理函数 第三节&#xff1a;7.3 RIGHT函数 7.3.1. RIGHT函数简介 RIGHT函数用于从文本字符串的末尾提取指定数量的字符&#xff0c;适合在需要从文本中提取特定后缀或处理固定格式的数据时使用。 语法&#xff1a; RIGHT(text, [num_chars]) text…

探索ChatGPT是如何改变癌症护理

了解生成式人工智能&#xff08;尤其是 ChatGPT&#xff09;如何通过高级数据集成和个性化患者管理来增强诊断和治疗&#xff0c;从而改变癌症治疗。了解 Color Health 的创新副驾驶模型及其对早期检测和患者结果的影响。 近年来&#xff0c;人工智能与医疗保健的融合为癌症治疗…

设计模式在Java项目中的实际应用

设计模式在Java项目中的实际应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 设计模式是软件开发中重要的思想工具&#xff0c;它提供了解决特定问题…

机器学习中的数学底蕴与设计模式

在说机器学习设计模式之前&#xff0c;想多说几句&#xff0c;在进入软件行业最初的10年&#xff0c;那时候耳熟能详的基本就是多线程编程&#xff0c;互斥同步锁&#xff0c;设计模式&#xff0c;OOA&#xff0c;OOP&#xff0c;常规数组&#xff0c;tree&#xff0c;图的数据…

体验升级:扫描全能王智能高清滤镜2.0全面测评

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C++——STL容器用法汇总

0. 写在前面 每次用C刷题都不可避免要用到STL很多容器&#xff0c;而每个容器的函数名称会有细微的差异&#xff0c;为了更加快速找到容器函数的用法&#xff0c;建立实例代码是最快速的方式。希望能够帮到你~ 1. STL容器用法汇总 C——STL(序列容器) arrayvectordequelist…

【CT】LeetCode手撕—19. 删除链表的倒数第 N 个结点

题目 原题连接&#xff1a;19. 删除链表的倒数第 N 个结点 1- 思路 模式识别&#xff1a;删除倒数第 n 个结点 ——> 定义 dummyHead 并用双指针实现删除逻辑 2- 实现 ⭐19. 删除链表的倒数第 N 个结点——题解思路 class Solution {public ListNode removeNthFromEnd(Li…

React-Native优质开源项目

React Native 是一个由 Facebook 开发的开源框架&#xff0c;允许开发者使用 JavaScript 和 React 来构建原生移动应用。它允许开发者编写一次代码&#xff0c;然后可以在 iOS 和 Android 平台上运行&#xff0c;而无需为每个平台单独编写代码。以下是 React Native 的一些关键…

进程间通信之信号全面总结与实例解析

目录 第一章&#xff1a;C语言信号基础 1.1 信号概念 1.2 信号系统调用 1.3 信号集与信号处理 1.4 实战案例&#xff1a;信号控制程序执行 1.5 实战案例&#xff1a;信号实现进程间通信 第二章&#xff1a;C语言信号高级应用 2.1 信号与多线程 2.2 信号与实时操作系统 …

openai的其他文本补全模型

文章目录 其他文本补全模型Completion 端点的输入选项Completion 端点的输出格式成本和数据隐私除了GPT-3和GPT-3.5,OpenAI还提供了其他几个模型。这些模型所用的端点与GPT-4和 ChatGPT 所用的不同。尽管无论是在价格方面还是在性能方面,GPT-3.5 Turbo 模型通常都是最佳选择,…

每天一个数据分析题(三百九十六)- 回归分析

如果回归分析中存在多重共线性&#xff0c;下列说法错误的是&#xff08; &#xff09;。 A. 所求出的参数的含义将变得不合理 B. 不会影响模型的预测结果 C. 可用岭回归或Lasso回归降低多重共线性对回归结果的影响 D. 存在多重共线性的变量所求参数将有可能变得不显著 数据…

MySQL 高级SQL高级语句(二)

一.CREATE VIEW 视图 可以被当作是虚拟表或存储查询。 视图跟表格的不同是&#xff0c;表格中有实际储存数据记录&#xff0c;而视图是建立在表格之上的一个架构&#xff0c;它本身并不实际储存数据记录。 临时表在用户退出或同数据库的连接断开后就自动消失了&#xff0c;而…

LLM学习记录

概述 语言模型经历过四个阶段的发展&#xff0c;依次从统计语言模型到神经网络语言模型&#xff08;NLM&#xff09;&#xff0c;到出现以 BERT 和 Transformer 架构为代表的预训练语言模型&#xff08;PLM&#xff09;&#xff0c;最终到大型语言模型阶段&#xff08;LLM&…