如何为LaravelPassportJWTToken添加自定义Claims,提升授权灵活性?

如何为laravelpassportjwttoken添加自定义claims,提升授权灵活性?

可以通过一下地址学习composer:学习地址

告别“信息孤岛”:Laravel Passport JWT Token 的痛点

想象一下,你正在开发一个多租户 SaaS 平台,或者一个拥有复杂权限体系的应用。用户通过 Laravel Passport 成功认证后,获得了一个 JWT Token。当这个 Token 被发送到 API 端点时,你可能需要知道:

这个用户属于哪个租户?他拥有哪些具体的权限?他是否是管理员?

如果这些信息没有包含在 JWT Token 中,那么在每个需要这些信息的 API 请求中,你都不得不:

从 Token 中解析出用户 ID。使用用户 ID 去数据库查询用户的详细信息、角色和权限。根据查询结果进行授权判断。

这种模式在请求量大时,会显著增加数据库的压力和 API 的响应时间。更糟糕的是,它使得授权逻辑分散且重复,降低了代码的可维护性。我们真正需要的是一个“自给自足”的 JWT Token,它能携带所有必要的授权上下文,让 API 端点能够快速、高效地做出决策。

引入救星:corbosman/laravel-passport-claims

幸运的是,PHP 社区的强大之处就在于总有优秀的解决方案出现。corbosman/laravel-passport-claims 这个 Composer 包就是专为解决 Laravel Passport JWT Token 信息不足问题而生。它提供了一种优雅的方式,允许你将自定义数据(Claims)注入到 Passport 生成的 JWT Token 中。

这个包的核心思想是利用管道(Pipeline)机制,在 Token 生成的过程中,让你有机会插入自定义逻辑来添加 Claims。这就像 Laravel 的中间件一样,Token 会依次经过你定义的多个处理类,每个类都可以向 Token 添加额外的信息。

快速上手:安装与配置

首先,使用 Composer 安装这个包。它目前支持 Laravel 9 和 10:

composer require corbosman/laravel-passport-claims

安装完成后,你需要发布其配置文件,以便定义你希望添加到 Token 中的 Claims:

php artisan vendor:publish --provider="CorBosmanPassportServiceProvider"

这会在 config 目录下生成一个 passport-claims.php 文件。

添加自定义 Claims:让 Token 携带你的数据

现在,是时候创建你的自定义 Claim 类了。这个包提供了一个 Artisan 命令来帮助你快速生成:

php artisan claim:generate Claims/UserRoleClaim

这会在 app/Claims 目录下创建一个 UserRoleClaim.php 文件(如果你没有 Claims 目录,它会自动创建)。打开这个文件,你会看到类似这样的结构:

addClaim('my-custom-key', 'my-custom-value');        return $next($token);    }}

handle 方法接收一个 AccessToken 实例,它继承自 LaravelPassportBridgeAccessToken,因此你可以访问到 Token 的各种信息,比如用户 ID ($token->getUserIdentifier())。这使得你可以根据用户 ID 查询数据库,并将用户的角色、权限等信息添加到 Token 中。

例如,我们来添加用户的邮箱和角色:

通义灵码 通义灵码

阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

通义灵码 31 查看详情 通义灵码

getUserIdentifier());        if ($user) {            $token->addClaim('email', $user->email);            $token->addClaim('roles', $user->roles()->pluck('name')->toArray()); // 假设用户有 roles 关联            $token->addClaim('tenant_id', $user->tenant_id); // 如果是多租户应用        }        return $next($token);    }}

添加完 Claim 类后,别忘了在 config/passport-claims.php 文件的 claims 数组中注册它:

 [        AppClaimsUserInfoClaim::class,        // 如果有其他 Claims,也在这里添加    ]];

现在,每当 Laravel Passport 生成一个新的 JWT Token 时,你的 UserInfoClaim 类就会被执行,并将用户的邮箱、角色和租户 ID 注入到 Token 中。

利用 Claims 进行授权:中间件的魔力

仅仅将 Claims 添加到 Token 中还不够,我们还需要利用它们进行授权。corbosman/laravel-passport-claims 提供了一个方便的路由中间件 claim,让你可以在路由级别检查 Token 中是否存在某个 Claim,甚至检查 Claim 的值是否符合预期。

首先,在 app/Http/Kernel.php 中注册这个中间件:

protected $routeMiddleware = [    'claim' => CorBosmanPassportHttpMiddlewareCheckForClaim::class,];

然后,你就可以在路由中使用它了:

use IlluminateSupportFacadesRoute;// 检查 Token 中是否存在 'roles' ClaimRoute::middleware(['auth:api', 'claim:roles'])->get('/admin/dashboard', function () {    return '只有拥有角色的用户才能访问管理后台';});// 检查 'roles' Claim 中是否包含 'admin'Route::middleware(['auth:api', 'claim:roles,admin'])->get('/super-admin/settings', function () {    return '只有管理员才能访问此设置';});// 检查 'tenant_id' Claim 是否为 1 或 2Route::middleware(['auth:api', 'claim:tenant_id,1|2'])->get('/tenant-specific-data', function () {    return '只有租户1或租户2的用户才能访问此数据';});

通过这种方式,你的 API 端点可以非常高效地进行授权判断,无需额外的数据库查询,极大地提升了性能和安全性。

格式化器(Formatters):解决兼容性问题

有时,你可能会遇到 JWT Token 中日期字段格式不兼容的问题(例如,某些库将时间戳存储为浮点数)。corbosman/laravel-passport-claims 也允许你配置自定义的格式化器来修改现有 Claims。

例如,如果你需要将浮点数时间戳转换回整数,可以在 config/passport-claims.php 中添加:

return [    'claims' => [        // ... 你的 Claims 类    ],    'formatters' => [        LcobucciJWTEncodingUnifyAudience::class,        LcobucciJWTEncodingUnixTimestampDates::class, // 将浮点数时间戳转换为整数    ]];

这确保了你的 JWT Token 在与其他 JWT 库交互时具有更好的兼容性。

总结与展望:让你的 API 飞起来!

通过 corbosman/laravel-passport-claims,我们成功地解决了 Laravel Passport JWT Token 无法携带自定义授权信息的问题。它的优势显而易见:

性能提升: 大幅减少了每次请求所需的数据库查询,降低了服务器负载,提高了 API 响应速度。授权灵活性: 可以将任何自定义数据(角色、权限、租户ID、用户偏好等)嵌入 Token,实现更细粒度的授权控制。代码整洁: 将授权上下文与认证过程解耦,使 API 端点的授权逻辑更加简洁明了。微服务友好: 在微服务架构中,Token 携带的丰富信息可以减少服务间通信,提升整体效率。

现在,你的 Laravel API 不再需要为获取用户权限而反复查询数据库,只需解析 Token 即可快速做出授权决策。这不仅让你的代码更加优雅高效,也为构建高性能、高可用的 API 打下了坚实基础。如果你正在使用 Laravel Passport,并且渴望更强大的 JWT Token 功能,那么 corbosman/laravel-passport-claims 绝对值得你一试!

以上就是如何为LaravelPassportJWTToken添加自定义Claims,提升授权灵活性?的详细内容,更多请关注php中文网其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
七日世界最后的勇气模组怎么搭配  七日世界最后的勇气模组搭配攻略
上一篇 2026年10月7日 08:28:50
Gate Alpha积分狂欢节,全新Alpha Points玩法全解析
下一篇 2025年12月8日 03:08:55

相关推荐

  • 蛙漫2台版正版资源入口 蛙漫2正版台版入口指引

    蛙漫2台版正版资源入口 蛙漫2正版台版入口指引蛙漫2台版正版资源入口 蛙漫2正版台版入口指引蛙漫2台版正版资源入口 蛙漫2正版台版入口指引蛙漫2台版正版资源入口 蛙漫2正版台版入口指引

    蛙漫2台版正版资源入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来蛙漫2正版台版入口指引,感兴趣的网友一起随小编来瞧瞧吧! 1、 ☞☞☞☞点此进入蛙漫2台版正版资源入口☜☜☜☜ 2、 ☞☞☞☞点此进入蛙漫2正版台版入口指引☜☜☜☜ 平台资源丰富度 1、平台汇集了来自不同地区的漫画作品,…

    2026年10月7日 • 用户投稿
    100
  • 华为MatePad如何浏览夸克网页版_华为MatePad浏览夸克网页版操作流程

    华为MatePad如何浏览夸克网页版_华为MatePad浏览夸克网页版操作流程华为MatePad如何浏览夸克网页版_华为MatePad浏览夸克网页版操作流程华为MatePad如何浏览夸克网页版_华为MatePad浏览夸克网页版操作流程华为MatePad如何浏览夸克网页版_华为MatePad浏览夸克网页版操作流程

    使用浏览器访问夸克网页版需输入正确网址并登录;02. 关闭平行视界避免横屏显示错位;03. 安装屏幕方向管理器优化横屏布局;04. 通过手机APP扫码快速登录网页版。 如果您尝试在华为MatePad上访问夸克网盘或其网页版服务,但无法正常加载页面或功能受限,可能是由于浏览器兼容性、应用设置或网络问题…

    2026年10月7日 • 用户投稿
    500
  • 不藏了!最强麒麟9020高调加持 华为三折叠只卖1万8

    不藏了!最强麒麟9020高调加持 华为三折叠只卖1万8不藏了!最强麒麟9020高调加持 华为三折叠只卖1万8不藏了!最强麒麟9020高调加持 华为三折叠只卖1万8不藏了!最强麒麟9020高调加持 华为三折叠只卖1万8

    加量不加价,余承东刚刚发布了华为第二款三折叠手机——mate xts非凡大师。 最受瞩目的是全新麒麟9020芯片正式上机,搭配HarmonyOS 5.1智能操作系统,整机性能提升36%。 这也是华为麒麟芯片,时隔四年多再次公开更新。 不藏了,这次华为芯片真的不藏了。 利用鸿蒙生态,Mate XTs首…

    2026年10月7日 • 用户投稿
    200
  • Java如何实现智能运维?异常检测算法

    Java如何实现智能运维?异常检测算法Java如何实现智能运维?异常检测算法Java如何实现智能运维?异常检测算法Java如何实现智能运维?异常检测算法

    异常检测算法在java智能运维中至关重要,常用方法包括统计方法、机器学习和时间序列分析。1. 统计方法如均值与标准差、z-score用于识别偏离均值的数据点;2. 机器学习方法如isolation forest、one-class svm和k-means适用于复杂数据集的异常识别;3. 时间序列分析…

    2026年10月7日 • 用户投稿
    100
  • Linux中如何用yum安装并搭建PHP环境

    1、首先,确保系统已安装yum包管理器。如果您的系统未安装yum,请执行以下命令: sudo apt-get install yum 2、接下来,需要添加一个yum的软件源,以便从中获取PHP包。在终端执行以下命令: sudo rpm -Uvh https://dl.fedoraproject.or…

    2026年10月7日
    100
  • 如何解决Symfony应用中对象间繁琐的属性映射问题,retailcrm/auto-mapper-bundle助你轻松实现数据转换

    如何解决Symfony应用中对象间繁琐的属性映射问题,retailcrm/auto-mapper-bundle助你轻松实现数据转换如何解决Symfony应用中对象间繁琐的属性映射问题,retailcrm/auto-mapper-bundle助你轻松实现数据转换如何解决Symfony应用中对象间繁琐的属性映射问题,retailcrm/auto-mapper-bundle助你轻松实现数据转换如何解决Symfony应用中对象间繁琐的属性映射问题,retailcrm/auto-mapper-bundle助你轻松实现数据转换

    可以通过一下地址学习composer:学习地址 在现代的 PHP 应用,特别是基于 Symfony 框架的项目中,我们经常会遇到这样的场景:你需要从数据库中取出数据(Entity 对象),将其转换为一个用于 API 响应或表单展示的数据传输对象(DTO),或者反过来,将用户提交的表单数据映射回一个实…

    2026年10月7日 • 用户投稿
    300
  • 蚂蚁集团入股多家芯片企业,加速布局 AI 算力基础设施

    蚂蚁集团入股多家芯片企业,加速布局 AI 算力基础设施蚂蚁集团入股多家芯片企业,加速布局 AI 算力基础设施蚂蚁集团入股多家芯片企业,加速布局 AI 算力基础设施蚂蚁集团入股多家芯片企业,加速布局 AI 算力基础设施

    近日,蚂蚁集团通过其下属投资平台上海云玡企业管理咨询有限公司,在短短七天内相继完成对昕原半导体、烨知芯科技以及云合智网三家芯片企业的投资或股权增持,进一步强化在AI算力底层基础设施领域的布局。 算家云 高效、便捷的人工智能算力服务平台 37 查看详情 这一系列动作延续了蚂蚁在芯片赛道的长期投入。自2…

    2026年10月7日 • 用户投稿
    000
  • UC浏览器直接通道-UC浏览器在线登录入口

    UC浏览器直接通道-UC浏览器在线登录入口UC浏览器直接通道-UC浏览器在线登录入口UC浏览器直接通道-UC浏览器在线登录入口UC浏览器直接通道-UC浏览器在线登录入口

    UC浏览器在线登录入口地址是https://www.ucweb.com/,用户可在此官网登录并享受多设备同步、智能搜索、个性化定制、高效内核优化、夜间模式、网页翻译、广告拦截、隐私保护、数据加密、插件扩展及云收藏等核心功能与安全服务。 UC浏览器在线登录入口地址在哪里?这是不少网友都关注的,接下来由…

    2026年10月7日 • 用户投稿
    300
  • VSCode如何设置智能代码导航 VSCode符号跳转与引用查找的高效技巧

    确保安装对应语言的官方扩展,如python或typescript相关插件,以提供基础代码导航功能;2. 配置settings.json文件,针对语言设置如”typescript.preferences.importmodulespecifier”等选项优化导航行为;3. 安装…

    2026年10月7日
    100
  • 海尔智家与用户共创数字营销新范式

    海尔智家与用户共创数字营销新范式海尔智家与用户共创数字营销新范式海尔智家与用户共创数字营销新范式海尔智家与用户共创数字营销新范式

    8月28日,海尔智家发布2025年半年报。数据显示,公司上半年实现营业收入1564.94亿元,同比增长10.2%;归母净利润达120.33亿元,同比增长15.6%,营收与利润双双创下历史新高。在次日举行的中报交流会上,针对投资者关注的国内数字化营销转型进展,海尔智家作出回应,表示公司正围绕全流程用户…

    2026年10月7日 • 用户投稿
    000
  • 如何创建自己的Composer包并发布到Packagist?

    如何创建自己的Composer包并发布到Packagist?如何创建自己的Composer包并发布到Packagist?如何创建自己的Composer包并发布到Packagist?如何创建自己的Composer包并发布到Packagist?

    答案是创建并发布Composer包到Packagist只需五步:准备项目结构、编写composer.json、推送到公共Git仓库、提交到Packagist、设置自动更新。首先确保项目包含src/、composer.json和README.md;接着配置composer.json,明确包名、命名空间…

    2026年10月7日 • 用户投稿
    1300
  • composer怎么清除单个包的缓存_Composer清除单个包缓存方法

    composer怎么清除单个包的缓存_Composer清除单个包缓存方法composer怎么清除单个包的缓存_Composer清除单个包缓存方法composer怎么清除单个包的缓存_Composer清除单个包缓存方法composer怎么清除单个包的缓存_Composer清除单个包缓存方法

    Composer未提供清除单个包缓存的命令,但可通过手动删除缓存文件实现。首先运行composer config cache-dir查看缓存路径,进入该目录下的files/子目录,找到对应包名(如monolog/monolog)并删除整个文件夹,下次安装时将重新下载,确认缓存已清除。 Compose…

    2026年10月7日 • 用户投稿
    100
  • Linux如何切换到root用户(linux禁止用户切换root)

    Linux如何切换到root用户(linux禁止用户切换root)Linux如何切换到root用户(linux禁止用户切换root)Linux如何切换到root用户(linux禁止用户切换root)Linux如何切换到root用户(linux禁止用户切换root)

    大家好,很高兴再次和大家见面,我是你们的朋友全栈君。 首先,我们通过输入pwd命令来查看当前用户目录: 当前用户是xg。在这里我解释一下[xg@localhost ~] 的含义:其中xg指的是当前用户,localhost指的是主机名,~表示当前目录,后面的符号表示普通用户。 2. 接下来,我们分别输…

    2026年10月7日 • 用户投稿
    000
  • 《夺宝奇兵:古老之圈》更新上线 现已支持RTX毛发

    《夺宝奇兵:古老之圈》更新上线 现已支持RTX毛发《夺宝奇兵:古老之圈》更新上线 现已支持RTX毛发《夺宝奇兵:古老之圈》更新上线 现已支持RTX毛发《夺宝奇兵:古老之圈》更新上线 现已支持RTX毛发

    英伟达宣布四款新作——《夺宝奇兵:古老之圈》“巨人教团”dlc、《微软模拟飞行2024》、《时间旅者:重生曙光》、《地狱即我们》现已支持dlss 4多帧生成! 此外,《夺宝奇兵:古老之圈:巨人教团》同步推出游戏更新,为DLC及游戏本体中的关键角色添加英伟达RTX Hair技术,带来更逼真的头发渲染效…

    2026年10月7日 • 用户投稿
    100
  • 如何配置Composer的GitHub API token以避免速率限制?

    如何配置Composer的GitHub API token以避免速率限制?如何配置Composer的GitHub API token以避免速率限制?如何配置Composer的GitHub API token以避免速率限制?如何配置Composer的GitHub API token以避免速率限制?

    配置 GitHub Personal Access Token 可解决 Composer 频繁访问触发的 API 速率限制问题。首先在 GitHub 创建具有 repo 和 read:packages 权限的 classic token,随后通过 composer config –glo…

    2026年10月7日 • 用户投稿
    100
  • 百度搜索记录同步怎么关闭_百度关闭搜索记录同步功能

    百度搜索记录同步怎么关闭_百度关闭搜索记录同步功能百度搜索记录同步怎么关闭_百度关闭搜索记录同步功能百度搜索记录同步怎么关闭_百度关闭搜索记录同步功能百度搜索记录同步怎么关闭_百度关闭搜索记录同步功能

    1、在百度App“我的”页面进入设置,选择“账号与安全”,关闭“搜索记录同步”功能;2、清除搜索历史并关闭“保存搜索记录”选项,防止本地记录生成;3、登录百度账号中心,于隐私设置中关闭跨设备同步,全面停止搜索记录在各设备间的同步与保存。 如果您希望停止百度搜索记录在不同设备间的自动同步,以保护个人隐…

    2026年10月7日 • 用户投稿
    000
  • Mac如何修改文件默认打开方式_Mac设置文件默认启动应用教程

    Mac如何修改文件默认打开方式_Mac设置文件默认启动应用教程Mac如何修改文件默认打开方式_Mac设置文件默认启动应用教程Mac如何修改文件默认打开方式_Mac设置文件默认启动应用教程Mac如何修改文件默认打开方式_Mac设置文件默认启动应用教程

    可通过右键菜单、打开方式下拉菜单、应用偏好设置或终端命令修改Mac文件默认打开方式。首先在Finder中右键文件选择“显示简介”,在“打开方式”中选定应用后点击“全部更改”可永久调整;若仅临时打开,可按住Control键点击文件,从“打开方式”子菜单选择目标程序而不影响默认设置;部分应用支持在自身偏…

    2026年10月7日 • 用户投稿
    900
  • Mac如何与iPhone隔空投送大文件_AirDrop隔空投送功能使用技巧

    Mac如何与iPhone隔空投送大文件_AirDrop隔空投送功能使用技巧Mac如何与iPhone隔空投送大文件_AirDrop隔空投送功能使用技巧Mac如何与iPhone隔空投送大文件_AirDrop隔空投送功能使用技巧Mac如何与iPhone隔空投送大文件_AirDrop隔空投送功能使用技巧

    首先确保Mac与iPhone均开启隔空投送并处于同一Apple ID下,其次检查蓝牙、Wi-Fi及系统版本兼容性,再通过照片或文件应用选择目标设备传输,最后调整隐私设置以允许接收大文件。 如果您尝试在Mac与iPhone之间传输大文件,但发现文件无法发送或接收,可能是由于设备设置、网络连接或系统兼容…

    2026年10月7日 • 用户投稿
    900
  • 抖音网页版账号安全怎么保障_抖音网页版账户安全防范措施

    抖音网页版账号安全怎么保障_抖音网页版账户安全防范措施抖音网页版账号安全怎么保障_抖音网页版账户安全防范措施抖音网页版账号安全怎么保障_抖音网页版账户安全防范措施抖音网页版账号安全怎么保障_抖音网页版账户安全防范措施

    抖音网页版账号安全需平台防护与用户设置结合,扫码登录、异常监测和数据加密保障基础安全,用户应设复杂密码、开启登录提醒、定期清理设备、绑定手机号,并警惕钓鱼网站及“百万保障”类诈骗,不点击不明链接或泄露验证码,通过官方渠道核实信息,有效防范风险。 1、立即进入“TikTok(抖音国际版)官网☜☜☜☜☜…

    2026年10月7日 • 用户投稿
    000
  • Java ExecutorService 线程池正确关闭与等待任务完成的实践指南

    Java ExecutorService 线程池正确关闭与等待任务完成的实践指南Java ExecutorService 线程池正确关闭与等待任务完成的实践指南Java ExecutorService 线程池正确关闭与等待任务完成的实践指南Java ExecutorService 线程池正确关闭与等待任务完成的实践指南

    本文旨在解决Java ExecutorService线程池在使用过程中,shutdown()方法提前结束导致任务未完成的问题。通过控制shutdown()的调用时机,确保所有提交的任务(包括子任务)执行完毕后再关闭线程池,从而避免数据不一致等问题。 在使用Java的ExecutorService时,…

    2026年10月7日 • 用户投稿
    900

发表回复

登录后才能评论
关注微信