Spring Security 中缓存 Introspect 请求

spring security 中缓存 introspect 请求

本文档介绍了如何在 Spring Security OAuth2 资源服务器中缓存 Opaque Token Introspection 请求,以提高系统在认证服务器不稳定时的可用性和性能。通过自定义 OpaqueTokenIntrospector 并集成缓存机制,可以有效减少对认证服务器的依赖,避免频繁的 401 错误,提升用户体验。

在使用 Spring Boot 构建 OAuth2 资源服务器时,通常需要与认证服务器进行交互以验证 Opaque Token 的有效性。当认证服务器出现不稳定情况时,频繁的 Introspection 请求会导致资源服务器性能下降,并可能出现大量的 401 错误。为了解决这个问题,我们可以通过缓存 Introspection 请求的结果来减少对认证服务器的依赖。

自定义 OpaqueTokenIntrospector

Spring Security 提供了 OpaqueTokenIntrospector 接口,用于从认证服务器获取 Token 的元数据。我们可以通过自定义该接口的实现来集成缓存逻辑。

首先,在 Spring Security 配置中暴露一个 OpaqueTokenIntrospector 的 Bean:

@Beanpublic OpaqueTokenIntrospector introspector() {    return new CustomOpaqueTokenIntrospector(this.introspectionUri, this.clientId, this.clientSecret);}

接下来,创建 CustomOpaqueTokenIntrospector 类,实现 OpaqueTokenIntrospector 接口,并在其中集成缓存逻辑。这里我们使用 org.ehcache 作为缓存的实现。

存了个图 存了个图

视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

存了个图 17 查看详情 存了个图

import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;import org.springframework.security.oauth2.server.resource.introspection.NimbusOpaqueTokenIntrospector;import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;import org.ehcache.Cache;import org.ehcache.CacheManager;import org.ehcache.config.builders.CacheConfigurationBuilder;import org.ehcache.config.builders.CacheManagerBuilder;import org.ehcache.config.builders.ResourcePoolsBuilder;import org.ehcache.expiry.ExpiryPolicyBuilder;import java.time.Duration;import java.time.Instant;public class CustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector {    private final OpaqueTokenIntrospector introspector;    private final CacheManager cacheManager;    private final Cache accessTokens;    public CustomOpaqueTokenIntrospector(String uri, String clientId, String clientSecret) {        cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(true);        accessTokens = cacheManager.createCache("iamCache",                CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, OAuth2AuthenticatedPrincipal.class,                                ResourcePoolsBuilder.heap(1000))                        .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(1800))));        this.introspector = new NimbusOpaqueTokenIntrospector(uri, clientId, clientSecret);    }    @Override    public OAuth2AuthenticatedPrincipal introspect(String token) {        if (this.accessTokens.containsKey(token)) {            OAuth2AuthenticatedPrincipal cachedPrincipal = this.accessTokens.get(token);            if (cachedPrincipal.getAttribute("exp") != null                    && ((Instant) cachedPrincipal.getAttribute("exp"))                    .isAfter(Instant.now())) {                return cachedPrincipal;            }            this.accessTokens.remove(token);        }        OAuth2AuthenticatedPrincipal principal = introspector.introspect(token);        this.accessTokens.put(token, principal);        return principal;    }    public Cache getAccessTokensCacheFromCacheManager() {        return cacheManager.getCache("iamCache", String.class, OAuth2AuthenticatedPrincipal.class);    }}

代码解释

CacheManager 和 Cache 的初始化: 在构造函数中,我们初始化了 CacheManager 和 Cache 对象。CacheManager 用于管理多个 Cache 实例,而 Cache 用于存储 Token 和对应的 OAuth2AuthenticatedPrincipal。缓存配置: CacheConfigurationBuilder 用于配置缓存的行为,例如:ResourcePoolsBuilder.heap(1000): 设置堆内存缓存的最大条目数为 1000。ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(1800)): 设置缓存的过期时间为 30 分钟 (1800 秒)。introspect 方法: introspect 方法是 OpaqueTokenIntrospector 接口的核心方法,用于验证 Token 的有效性并返回 Token 的元数据。首先,检查缓存中是否存在该 Token。如果缓存中存在该 Token,并且 Token 的过期时间未到,则直接从缓存中返回 OAuth2AuthenticatedPrincipal。如果缓存中不存在该 Token,或者 Token 已经过期,则调用 NimbusOpaqueTokenIntrospector 从认证服务器获取 Token 的元数据,并将结果存储到缓存中。

注意事项

缓存失效策略: 选择合适的缓存失效策略至关重要。这里使用了基于时间的失效策略,即 Token 在一定时间后过期。你也可以根据实际情况选择其他策略,例如基于大小的失效策略或基于访问频率的失效策略。缓存大小: 缓存的大小需要根据实际情况进行调整。如果缓存太小,则会导致频繁的缓存失效,从而降低性能。如果缓存太大,则会占用过多的内存资源。异常处理: 在实际应用中,需要考虑各种异常情况,例如认证服务器不可用、网络连接错误等。建议添加适当的异常处理逻辑,以保证系统的稳定性和可靠性。缓存同步: 在分布式系统中,需要考虑缓存同步的问题。可以使用分布式缓存解决方案,例如 Redis 或 Memcached,来保证各个节点上的缓存数据一致。

总结

通过自定义 OpaqueTokenIntrospector 并集成缓存机制,可以有效减少对认证服务器的依赖,提高系统在认证服务器不稳定时的可用性和性能。在实际应用中,需要根据具体情况选择合适的缓存失效策略、缓存大小和异常处理机制,以保证系统的稳定性和可靠性。

以上就是Spring Security 中缓存 Introspect 请求的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
儿童Python编程学习平台搜罗 按年龄和难度分类的在线编程网站总览
上一篇 2025年11月5日 15:46:26
奥特曼超时空英雄最新兑换码汇总
下一篇 2025年11月5日 15:46:38

相关推荐

  • 内存价格大涨15%以上 三星Q3利润远超预期:三年来最高

    10月14日消息,全球存储芯片市场正迎来七年来最繁荣的时期,作为内存与闪存领域的领军企业,三星电子在此轮价格飙升中获益显著,其第三季度运营利润远超市场预期。 三星于今日发布Q3季度初步财报数据,显示该季度营业利润预计达12.1万亿韩元(约合85亿美元),较此前LSEG SmartEstimate对3…

    2026年8月31日
    100
  • 解决”找不到 msvcp140_codecvt_ids.dll”错误的完整方法

    解决”找不到 msvcp140_codecvt_ids.dll”错误的完整方法解决”找不到 msvcp140_codecvt_ids.dll”错误的完整方法解决”找不到 msvcp140_codecvt_ids.dll”错误的完整方法解决”找不到 msvcp140_codecvt_ids.dll”错误的完整方法

    在windows操作系统中,运行部分应用程序或游戏时,许多用户可能会看到“程序无法启动,因为计算机缺少 msvcp140_codecvt_ids.dll”这类提示。该问题通常源于系统未安装或丢失关键的运行库文件。本文将为您全面介绍几种有效的解决方案,帮助您迅速修复该错误,恢复正常运行。 一、借助 D…

    2026年8月31日 用户投稿
    200
  • 尊界S800技术发布会召开 带来六大全新技术

    尊界S800技术发布会召开 带来六大全新技术尊界S800技术发布会召开 带来六大全新技术尊界S800技术发布会召开 带来六大全新技术尊界S800技术发布会召开 带来六大全新技术

    鸿蒙智行尊界s800技术发布会:六大智能科技革新出行体验 2月20日,鸿蒙智行尊界品牌盛大发布尊界S800,华为常务董事余承东亲临现场,揭晓了这款车型搭载的六大颠覆性智能技术。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 华为途灵龙行平台…

    2026年8月31日 用户投稿
    100
  • 126邮箱登录入口官网首页 126邮箱登录网页版入口

    126邮箱登录入口官网首页为https://mail.126.com,用户可点击页面左上角“登录”进入,输入含“@126.com”的账号及密码,完成验证后即可登录。 126邮箱登录入口官网首页在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来126邮箱登录网页版入口,需要使用126邮箱进行日…

    2026年8月31日
    000
  • 如何解决PHP单元测试中内置函数的模拟问题?使用Composer可以!

    可以通过以下地址学习Composer:学习地址 在进行php单元测试时,模拟内置函数(如time())是一个常见但棘手的问题。直接模拟这些函数不仅复杂,而且可能会受到各种限制和约束。最近在进行一个项目的单元测试时,我遇到了这样的难题:如何在不影响其他测试的前提下,准确地模拟time()函数的返回值?…

    用户投稿 2026年8月31日
    000
  • 0x80073701错误代码怎么解决 简单几步教会你

    0x80073701错误代码怎么解决 简单几步教会你0x80073701错误代码怎么解决 简单几步教会你0x80073701错误代码怎么解决 简单几步教会你0x80073701错误代码怎么解决 简单几步教会你

    windows更新过程中出现错误代码“0x80073701”是许多用户常遇到的问题。该错误通常会导致系统无法成功安装更新补丁,尤其是在尝试安装功能更新或累积更新时更为明显。此问题的根本原因多为系统关键文件丢失或windows更新组件损坏。本文将深入解析“0x80073701”错误的来源,并提供多种高…

    2026年8月31日 用户投稿
    000
  • 如何解决JWT数据加密问题?使用web-token/jwt-encryption可以!

    在开发一个需要使用JSON Web Token(JWT)进行数据传输的项目时,我遇到了一个棘手的问题:如何确保JWT中的数据在传输过程中是安全的?尝试了多种方法后,我发现web-token/jwt-encryption库能够轻松解决这个问题。 可以通过以下地址学习composer:学习地址 JWT是…

    用户投稿 2026年8月31日
    000
  • 微信小程序在华为鸿蒙4.0系统上定位失败是什么原因?

    微信小程序在华为鸿蒙4.0系统上的定位异常问题分析 部分开发者反映,其微信小程序在华为鸿蒙4.0系统上出现定位功能异常:定位成功率低,甚至无法启动定位。然而,在iOS系统上运行正常。本文将对此问题进行分析,并提供解决方案。 开发者提供的代码使用了uni.getLocation()方法进行定位,该方法…

    2026年8月31日
    000
  • 美媒:苹果人工智能迅速登陆低价手机,但AI恐难提振销量

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ iPhone 16e:苹果AI功能下探入门级市场 据《纽约时报》报道,苹果公司将人工智能(AI)功能扩展至旗下最经济实惠的iPhone机型——iPhone 16e。这款新机型搭载了苹果的AI系统…

    2026年8月31日
    000
  • Java字符串处理:如何用正则表达式精准提取中括号内外文本?

    Java字符串处理:巧用正则表达式提取中括号文本 在Java开发中,经常需要从字符串中提取特定信息。本文将讲解如何使用正则表达式高效地从包含中括号的字符串中提取中括号前后的文本。例如,对于字符串“test[10000]”,如何快速提取“test”和“10000”? 传统字符串操作方法处理这类问题效率…

    2026年8月31日
    000
  • 如何解决Laravel项目中邮件发送问题?使用s-ichikawa/laravel-sendgrid-driver可以!

    可以通过一下地址学习composer:学习地址 在开发laravel项目时,邮件发送功能是一个常见的需求。然而,配置和使用邮件服务有时会遇到各种问题,如无法发送邮件、配置复杂等。最近在处理一个项目时,我遇到了类似的问题,尝试了多种方法后,最终通过使用s-ichikawa/laravel-sendgr…

    用户投稿 2026年8月31日
    000
  • Laravel中Redis缓存优化技巧

    标题:优化Laravel中Redis缓存的技巧 在现代Web应用程序开发中,优化缓存是提高性能和响应速度的重要步骤之一。在Laravel框架中,Redis是一个常用的缓存驱动程序,可以有效地提升应用程序的性能。本文将介绍如何在Laravel中优化Redis缓存,以及一些实用的技巧和具体的代码示例。 …

    2026年8月31日
    000
  • 如何解决在线支付系统的开发难题?使用Composer可以轻松搞定!

    可以通过以下地址学习 Composer:学习地址 在开发在线支付系统时,与支付平台的集成是一个关键步骤。我最近在开发一个项目时,需要与 chargebee 支付平台对接,遇到了不少困难。首先,我尝试了手动集成 chargebee 的 api,但发现这不仅耗时费力,还容易出错。之后,我尝试了其他一些库…

    用户投稿 2026年8月31日
    100
  • PHP file_get_contents 处理多URL请求的最佳实践

    本教程旨在解决PHP中处理多URL请求时常见的逻辑错误,特别是当从数据库查询结果生成URL并使用file_get_contents访问时。文章将揭示嵌套循环的陷阱,并提供一种高效、直接的迭代处理方法,确保每个URL被正确且仅访问一次,同时探讨性能、错误处理和URL编码等专业实践。 1. 问题背景与常…

    2026年8月31日
    000
  • [python]windows上通过whl文件安装numpy+mkl教程

    在windows系统中通过 .whl 文件安装 numpy+mkl ,可遵循以下步骤完成: 一、前期准备 下载对应版本的 .whl 文件:前往可信的Python第三方库镜像站点,例如 gitee.com/FIRC/pythonlibs_whl_mirror 。进入页面后按下 Ctrl+F 搜索关键词…

    2026年8月31日
    100
  • 深入了解Laravel Redis扩展的使用方法

    Laravel 是一款流行的 PHP 开发框架,拥有丰富的功能和灵活的扩展性,其中 Redis 扩展则是常用的一种数据库缓存工具。本文将深入探讨 Laravel 中 Redis 扩展的使用方法,详细介绍其基本概念、配置方式和具体代码示例,帮助开发者更好地利用 Redis 扩展提升系统性能。 一、什么…

    2026年8月31日
    000
  • Spring Boot Jar包含多个启动类,如何指定启动哪个?

    Spring Boot项目打包成Jar后,如何指定多个启动类中的其中一个? 在模块化开发或微服务架构中,一个Spring Boot项目可能包含多个带有@SpringBootApplication注解的启动类。将项目打包成单个Jar文件后,如何指定哪个类作为程序入口点就显得至关重要。本文将详细介绍解决…

    2026年8月31日
    000
  • 哔哩哔哩大会员专属功能在哪开启_B站会员专属功能开启指南

    开启B站大会员功能需依次设置:一、在“观看偏好”中设定清晰度为1080P+或自适应,开启自动跳过片头片尾及杜比全景声;二、在“隐私权限设置”中关闭个性化广告推荐,并于“播放设置”开启免广告播放;三、在“我的装扮”中领取大会员专属头像框、挂件并使用特效弹幕;四、在“账号与安全”中开启数据同步,实现多端…

    2026年8月31日
    000
  • Laravel Redis教程:快速掌握用法

    Laravel Redis教程:快速掌握用法,需要具体代码示例 在现代的Web开发中,缓存是提高网站性能的重要手段之一。而Redis作为一种高性能的内存数据库,被广泛应用于各种Web应用程序中。在本教程中,我们将介绍如何在Laravel框架中使用Redis来提升性能和扩展功能。 一、安装Redis …

    2026年8月31日
    000
  • 2025全球数字经济大会聚焦数字转型 微美全息5G+AI场景创新领航未来

    近日,2025全球数字经济大会在北京盛大开幕,大会以“建设数字友好城市”为核心主题,围绕新技术支撑城市高效治理、构建完善的城市智能中枢体系、推动数字化制度改革等方向释放政策信号,描绘出推进城市全域数字化转型的新蓝图。 在大会设立的“数字经济国际合作交流体验区”中,从人工智能大模型在金融、医疗、教育等…

    2026年8月31日
    100

发表回复

登录后才能评论
关注微信