Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Laravel自定义认证守卫?守卫如何配置使用?_创想鸟

Laravel自定义认证守卫?守卫如何配置使用?

答案:Laravel自定义认证守卫通过实现Guard和UserProvider接口,允许开发者根据业务需求从非标准源(如API密钥、外部服务)认证用户,提升灵活性。

laravel自定义认证守卫?守卫如何配置使用?

Laravel自定义认证守卫,说白了,就是让你能跳出框架默认的“用户表+密码”认证模式,根据自己业务的独特需求来验证用户身份。它的配置和使用,核心在于定义一个能处理用户查找和验证的“驱动”(driver),然后把它注册到

auth.php

配置文件里。这为处理那些不走寻常路的用户类型、API令牌认证,甚至是纯粹的外部系统认证,提供了巨大的灵活性。

解决方案

要实现自定义认证守卫,我们通常需要以下几个关键步骤。这就像是搭积木,你需要先准备好积木块,再把它们组装起来。

1. 理解守卫(Guard)与用户提供者(User Provider)

守卫(Guard): 这是认证的核心,它负责从当前的HTTP请求中提取认证凭证(比如session ID、API Key、JWT令牌),然后利用用户提供者去查找对应的用户,并最终判断用户是否已认证。Laravel自带的

session

守卫就是通过session来识别用户,

token

守卫(通常与Passport或Sanctum结合)则通过Bearer token。用户提供者(User Provider): 顾名思义,它负责提供用户。当守卫需要一个用户对象时,它会请求用户提供者。默认情况下,Laravel的

EloquentUserProvider

会从数据库加载用户。但如果你的用户数据不在数据库,或者需要特殊的加载逻辑,你就需要自定义用户提供者。

2. 创建自定义用户提供者(如果默认的不适用)

如果你的用户数据不在

users

表,或者你需要从外部服务获取用户,那么你需要实现

IlluminateContractsAuthUserProvider

接口。这个接口定义了几个关键方法:

retrieveById($identifier)

: 根据用户ID获取用户。

retrieveByToken($identifier, $token)

: 根据用户ID和“记住我”令牌获取用户。

updateRememberToken(Authenticatable $user, $token)

: 更新用户的“记住我”令牌。

retrieveByCredentials(array $credentials)

: 根据凭证(如用户名/密码)获取用户。

validateCredentials(Authenticatable $user, array $credentials)

: 验证用户凭证是否正确。

举个例子,如果你想从一个

api_keys

表来认证,可以创建一个

ApiKeyUserProvider

。

3. 创建自定义守卫

这是最核心的部分。你可以创建一个类来实现

IlluminateContractsAuthGuard

接口,或者对于简单场景,直接使用一个闭包(Closure)来定义守卫逻辑。

一个自定义守卫的核心是

user()

方法,它负责从请求中获取凭证并返回当前认证用户。

// app/Auth/MyCustomGuard.phpprovider = $provider;        $this->request = $request;    }    public function user()    {        // 如果用户已经设置,直接返回        if (! is_null($this->user)) {            return $this->user;        }        // 从请求中获取你的自定义凭证,比如一个特殊的HTTP头        $customToken = $this->request->header('X-My-Custom-Token');        if (! $customToken) {            return null;        }        // 使用用户提供者根据凭证查找用户        $user = $this->provider->retrieveByCredentials(['token' => $customToken]);        // 如果找到了用户,并且凭证也验证通过(这里假设token本身就是凭证)        if ($user && $this->provider->validateCredentials($user, ['token' => $customToken])) {            $this->setUser($user); // 设置当前认证用户        }        return $this->user;    }    public function validate(array $credentials = [])    {        // 这个方法通常用于尝试登录时验证凭证,对于无状态API可能不常用        // 但如果你的守卫需要支持登录,可以实现它        $user = $this->provider->retrieveByCredentials($credentials);        if ($user && $this->provider->validateCredentials($user, $credentials)) {            $this->setUser($user);            return true;        }        return false;    }}

4. 注册自定义提供者和守卫

这通常在

app/Providers/AuthServiceProvider.php

的

boot()

方法中完成。

// app/Providers/AuthServiceProvider.phpuse AppAuthMyCustomGuard;use AppAuthMyCustomUserProvider; // 如果你创建了自定义用户提供者use IlluminateSupportFacadesAuth;public function boot(){    $this->registerPolicies();    // 注册自定义用户提供者(如果需要)    Auth::provider('my_custom_provider', function ($app, array $config) {        return new MyCustomUserProvider();    });    // 注册自定义守卫    Auth::extend('my_custom_guard_driver', function ($app, $name, array $config) {        // 创建一个自定义守卫实例,并传入用户提供者和当前请求        // $config['provider'] 会指向 auth.php 中配置的 provider 名称        return new MyCustomGuard(Auth::createUserProvider($config['provider']), $app['request']);    });}

最后,在

config/auth.php

文件中,将你的自定义守卫和提供者添加到配置中:

// config/auth.php'guards' => [    // ...    'my_custom_auth' => [ // 你的自定义守卫名称        'driver' => 'my_custom_guard_driver', // 对应 Auth::extend 中的名称        'provider' => 'my_custom_provider', // 对应 Auth::provider 中的名称    ],],'providers' => [    // ...    'my_custom_provider' => [ // 你的自定义用户提供者名称        'driver' => 'my_custom_provider', // 对应 Auth::provider 中的名称        // 'model' => AppModelsMyCustomUser::class, // 如果是EloquentProvider    ],],

5. 使用自定义守卫

一旦注册完成,你就可以像使用任何其他Laravel守卫一样使用它了。

在路由中间件中:

Route::middleware('auth:my_custom_auth')->get('/protected', ...);

在控制器中:

Auth::guard('my_custom_auth')->user();

为什么我们需要自定义认证守卫,它解决了哪些痛点?

有时候,默认的认证机制就是无法满足我们千奇百怪的需求。自定义认证守卫的存在,就是为了应对这些“非标”场景,它解决了以下几个核心痛点:

多用户类型认证:想象一下,你的系统里有普通用户、管理员、还有通过API密钥访问的第三方服务。它们可能存储在不同的数据源,或者有截然不同的认证逻辑。默认的

users

表和单一认证流程显然不够用。自定义守卫允许你为每种用户类型定义一套独立的认证逻辑,互不干扰。API 密钥认证:对于无状态的API服务,传统的基于session的认证就不适用了。自定义守卫可以轻松实现通过请求头(如

X-API-Key

)携带的API密钥进行认证。这比设置一套完整的JWT或OAuth2流程要轻量得多,特别适合内部服务间的调用或者简单的第三方集成。与遗留系统集成:当你需要将一个全新的Laravel应用与一个已经存在的、可能非常老旧且认证机制非标准的系统集成时,自定义守卫简直是救命稻草。你可以编写逻辑来桥接旧系统的认证接口,让Laravel也能理解和验证那些“古老”的用户。无数据库用户或外部认证源:有些系统用户身份完全由外部服务(如LDAP、OAuth服务,但不是Laravel Socialite能直接处理的那种)管理,本地数据库根本不存储用户凭证。自定义守卫可以定义一个

UserProvider

,不从数据库加载,而是从外部API获取用户数据并验证。复杂认证逻辑:如果你的认证需要基于IP地址、设备指纹、多因素认证(MFA)的额外验证,或者有其他业务特定的条件,自定义守卫提供了一个干净的扩展点来实现这些复杂的逻辑。

我个人觉得,Laravel在认证这块的设计真的非常灵活,它没有强制你必须用它那一套,而是提供了一个清晰的扩展点。这种开放性在应对各种奇葩需求时,简直是开发者的福音,避免了为了一个特殊需求而去硬改框架核心的痛苦。

如何编写一个基于API Key的自定义守卫?具体实现步骤和代码示例。

我们来走一个实际的例子,构建一个基于

X-API-Key

请求头的自定义守卫。这个守卫会从请求头中获取API Key,然后去数据库中查找对应的用户。

1. 定义API Key用户模型和迁移

首先,我们需要一个模型来代表这些API Key用户。我们假设有一个`

以上就是Laravel自定义认证守卫?守卫如何配置使用?的详细内容,更多请关注php中文网其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Pr如何合并psd文件
上一篇 2026年9月11日 06:27:57
VSCode容器开发:搭配Docker环境
下一篇 2026年9月11日 06:32:15

相关推荐

  • 抖音辅助账号上限怎么解除?抖音辅助账号上限解除最简单方法

    抖音辅助账号上限怎么解除?抖音辅助账号上限解除最简单方法抖音辅助账号上限怎么解除?抖音辅助账号上限解除最简单方法抖音辅助账号上限怎么解除?抖音辅助账号上限解除最简单方法抖音辅助账号上限怎么解除?抖音辅助账号上限解除最简单方法

    在如今火爆的短视频领域,抖音已成为众多内容创作者和商家运营的首选平台。为了实现更高效的推广与内容分发,不少人选择使用辅助账号来配合主账号运营。然而,“抖音辅助账号上限”这一问题常常让用户感到困扰。本文将为你全面解析抖音辅助账号上限怎么解除,并分享最实用、最简单的解决策略,助你轻松突破限制,玩转抖音生…

    2026年9月24日 • 用户投稿
    000
  • sublime怎么设置markdown的图片预览_sublime Markdown图片预览设置

    sublime怎么设置markdown的图片预览_sublime Markdown图片预览设置sublime怎么设置markdown的图片预览_sublime Markdown图片预览设置sublime怎么设置markdown的图片预览_sublime Markdown图片预览设置sublime怎么设置markdown的图片预览_sublime Markdown图片预览设置

    Sublime Text需安装插件实现Markdown图片预览:1. 通过Package Control安装MarkdownEditing、MarkdownPreview或OmniMarkupPreviewer;2. 使用MarkdownPreview在浏览器中预览,确保图片路径正确;3. Omni…

    2026年9月24日 • 用户投稿
    100
  • 利用Laravel高效串联查询:从上一个结果获取数据

    本教程旨在解决laravel中基于前一个查询结果进行后续查询的常见问题。文章详细阐述了如何避免因`take(1)->toarray()`导致的多维数组问题,并优化了查询效率,通过使用`first()`方法获取单个记录,并直接在数据库层面进行过滤,而非在内存中处理大量数据,从而提升应用性能和代码…

    2026年9月24日
    600
  • 多模态AI如何处理射电望远镜数据 多模态AI深空探测应用

    多模态AI如何处理射电望远镜数据 多模态AI深空探测应用多模态AI如何处理射电望远镜数据 多模态AI深空探测应用多模态AI如何处理射电望远镜数据 多模态AI深空探测应用多模态AI如何处理射电望远镜数据 多模态AI深空探测应用

    多模态ai通过融合多种数据提升射电望远镜数据分析能力。它将无线电信号转化为频谱图、时间序列等形式,并结合光学图像等信息综合判断信号频率、强度、出现时间与方向;1.时空对齐匹配不同设备数据;2.特征级融合提取关键特征;3.决策级融合综合多个模型结果;实际应用于“突破聆听计划”筛选射电信号,面临数据格式…

    2026年9月24日 • 用户投稿
    200
  • 使用 Appium 实现 Gmail OTP 验证自动化

    使用 Appium 实现 Gmail OTP 验证自动化使用 Appium 实现 Gmail OTP 验证自动化使用 Appium 实现 Gmail OTP 验证自动化使用 Appium 实现 Gmail OTP 验证自动化

    本文档旨在指导开发者如何使用 Appium 自动化测试移动应用中的 Gmail OTP (One-Time Password) 验证流程。我们将探讨如何通过 Appium 定位 OTP 输入框,并使用获取到的 OTP 值进行输入,从而完成验证流程的自动化。 定位 OTP 输入框 在 Appium 中…

    2026年9月24日 • 用户投稿
    300
  • 全彩3D漫画汉化资源汇总_ACG漫画在线观看地址

    全彩3D漫画汉化资源汇总_ACG漫画在线观看地址全彩3D漫画汉化资源汇总_ACG漫画在线观看地址全彩3D漫画汉化资源汇总_ACG漫画在线观看地址全彩3D漫画汉化资源汇总_ACG漫画在线观看地址

    全彩3D漫画汉化资源可通过manwa.size/booklist平台获取,该网站汇集日漫、韩漫及国创全彩漫画,支持下拉式阅读,界面简洁且适配多端,无需下载即可在线流畅观看。 全彩3D漫画汉化资源汇总_ACG漫画在线观看地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来全彩3D漫画汉化资源…

    2026年9月24日 • 用户投稿
    600
  • TradingAgents-CN— 中文多智能体金融交易决策框架

    TradingAgents-CN— 中文多智能体金融交易决策框架TradingAgents-CN— 中文多智能体金融交易决策框架TradingAgents-CN— 中文多智能体金融交易决策框架TradingAgents-CN— 中文多智能体金融交易决策框架

    TradingAgents-CN是什么 tradingagents-cn是基于多智能体大模型的中文金融交易决策框架,在tauricresearch/tradingagents的基础上进行了开发,为中文用户提供了完整的文档体系和本地化支持。框架模拟真实交易公司的专业分工和协作决策流程,通过多个专业化a…

    2026年9月24日 • 用户投稿
    900
  • 使用 Java 读取文件并处理编码问题的实用指南

    使用 Java 读取文件并处理编码问题的实用指南使用 Java 读取文件并处理编码问题的实用指南使用 Java 读取文件并处理编码问题的实用指南使用 Java 读取文件并处理编码问题的实用指南

    本文旨在帮助开发者理解如何在 Java 中以字节方式读取文件,并正确处理字符编码问题。文章将详细介绍如何使用 FileInputStream 读取文件,以及如何在将字节转换为字符串时指定正确的编码方式,避免出现乱码问题。此外,还将讨论如何按固定大小的块读取文件,并提供代码示例进行演示。 理解字节流和…

    2026年9月24日 • 用户投稿
    100
  • php-gd怎么销毁图像资源_php-gd释放内存中的图像

    使用imagedestroy()函数销毁PHP-GD图像资源以避免内存泄漏。创建的资源如$image需在处理后调用imagedestroy($image)释放,尤其在循环中应每轮结束前销毁资源,推荐结合is_resource()判断有效性,遵循“谁创建,谁销毁”原则,确保内存高效管理。 在使用 PH…

    2026年9月24日
    000
  • Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库

    Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库Java中实现PDF文档并排对比及差异高亮显示:使用pdfcompare库

    本文介绍了如何在Java环境中,利用开源库pdfcompare实现两个PDF文档的并排对比,并独立高亮显示其差异。针对传统方案合并PDF的痛点,pdfcompare提供了一种优雅的解决方案,确保原始文档结构不变,仅在各自副本中标记出不同之处,满足特定业务需求。 1. 背景与挑战 在处理文档版本控制或…

    2026年9月24日 • 用户投稿
    1100
  • Debian系统如何实现GitLab的高可用性

    Debian系统如何实现GitLab的高可用性Debian系统如何实现GitLab的高可用性Debian系统如何实现GitLab的高可用性Debian系统如何实现GitLab的高可用性

    在debian系统上实现gitlab的高可用性可以通过以下几种方法: 通过Kubernetes进行部署 安装Redis:利用Helm部署Redis,并配置持久化存储以确保数据的持久性。安装PostgreSQL:同样通过Helm部署PostgreSQL,并设置主从复制或集群模式,以确保数据的高可用性。…

    2026年9月24日 • 用户投稿
    800
  • 如何在Debian 10(Buster)Linux上安装MySQL

    了解如何在debian 10(buster)linux上安装mysql。本指南将引导您完成在最新版本的debian系统上安装mysql 8或mysql 5.7的步骤。 第1步 – 准备工作 首先,确保您拥有Debian 10系统的shell访问权限。如果是远程系统,可以通过SSH连接。W…

    2026年9月24日
    1000
  • 比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址

    比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址比漫熊正版官网入口_比漫熊漫画官网正版漫画在线阅读地址

    比漫熊漫画官网入口为https://www.bimanxiong.com,平台涵盖恋爱、悬疑等多种题材,每日更新连载,提供高清画质与简洁界面,支持分类筛选、夜间模式及书架收藏,优化阅读体验。 比漫熊漫画官网入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来比漫熊漫画官网在线阅读入口地…

    2026年9月24日 • 用户投稿
    700
  • ubuntu如何mount一个远程目录

    在ubuntu中挂载一个远程目录,通常可以使用nfs(network file system)或者sshfs(ssh filesystem)。以下是两种方法的步骤: 方法一:使用NFS挂载远程目录 安装NFS客户端(如果尚未安装): sudo apt updatesudo apt install n…

    2026年9月24日
    700
  • 怎么在mysql中创建一个表 mysql新建数据表步骤教程

    在 mysql 中创建表的步骤和建议包括:1. 明确业务需求,设计表结构;2. 使用 create table 语句创建表,选择合适的数据类型和设置主键、索引;3. 考虑大数据量时使用分区;4. 设置正确的字符集和排序规则;5. 谨慎使用索引;6. 使用 if not exists 避免重复创建表。…

    2026年9月24日
    100
  • Spring Boot @Nested 测试中属性覆盖与隔离策略

    Spring Boot @Nested 测试中属性覆盖与隔离策略Spring Boot @Nested 测试中属性覆盖与隔离策略Spring Boot @Nested 测试中属性覆盖与隔离策略Spring Boot @Nested 测试中属性覆盖与隔离策略

    本文深入探讨了在Spring Boot集成测试中,如何利用@Nested注解结合@TestPropertySource实现细粒度的属性配置和隔离。通过详细的示例代码,展示了外部测试类和嵌套测试类如何定义各自的属性集,以及这些属性在不同测试上下文中的继承与覆盖机制,从而确保测试环境的精确控制和独立性。…

    2026年9月24日 • 用户投稿
    100
  • 漫客栈免费登录网页_漫客栈官方网站漫画入口

    漫客栈免费登录网页_漫客栈官方网站漫画入口漫客栈免费登录网页_漫客栈官方网站漫画入口漫客栈免费登录网页_漫客栈官方网站漫画入口漫客栈免费登录网页_漫客栈官方网站漫画入口

    漫客栈免费登录网页入口是https://www.mankezhan.com/,该平台提供海量原创漫画资源,涵盖多种题材,支持多端阅读、离线下载与互动评论,阅读体验良好。 漫客栈免费登录网页入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来漫客栈官方网站漫画入口,感兴趣的网友一起随小编…

    2026年9月24日 • 用户投稿
    200
  • 163邮箱官网手机免费入口 163免费邮箱移动登录

    163邮箱官网手机免费入口 163免费邮箱移动登录163邮箱官网手机免费入口 163免费邮箱移动登录163邮箱官网手机免费入口 163免费邮箱移动登录163邮箱官网手机免费入口 163免费邮箱移动登录

    163邮箱官网手机免费入口可通过访问mail.163.com自动跳转至移动版,或在应用商店下载“网易邮箱”App登录,支持多账号管理、邮件收发、附件添加、消息推送及多设备同步,并提供登录保护、主题自定义和垃圾邮件过滤等安全与个性化功能。 163邮箱官网手机免费入口在哪里?这是不少网友都关注的,接下来…

    2026年9月24日 • 用户投稿
    100
  • ubuntu如何mount网络驱动器

    在ubuntu中挂载网络驱动器有多种方法,以下是一些常见的方法: 方法一:使用mount命令 确定网络驱动器的地址:例如,如果是Samba共享,地址可能是smb://server/share。如果是NFS共享,地址可能是nfs://server/share。安装必要的软件包:对于Samba共享,安装…

    2026年9月24日
    000
  • Java中双精度浮点数的小数位控制技巧

    Java中双精度浮点数的小数位控制技巧Java中双精度浮点数的小数位控制技巧Java中双精度浮点数的小数位控制技巧Java中双精度浮点数的小数位控制技巧

    本文深入探讨了在Java中有效控制double类型数值小数位数的方法。通过Math.round()函数结合乘除操作,可以实现数值本身的四舍五入并改变其精度;而String.format()则提供了灵活的字符串格式化功能,用于在不修改原始数值的情况下精确控制显示的小数位数。这两种方法分别适用于不同的业…

    2026年9月24日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信