Spring Security 注解AuthenticationPrincipal 失效排查

基于Spring Security OAuth2从零构建生产级授权与资源服务器实战指南 OAuth 2.0是现代应用安全授权的核心框架,它通过定义资源所有者、客户端、授权服务器和资源服务器四大角色,解决了第三方应用安全访问用户数据而不暴露密码的难题。其核心原理在于使用访问令牌(Access Token)作为授权凭证,并通过授权码、客户端凭证等多种模式适应不同场景。在微服务架构中,OAuth 2.0的价值尤为突出,它为服务间安全通信和统一身份管理提供了标准化方案。Spring Security OAuth2作为Java生态的主流实现,通过其授权服务器和资源服务器组件,让开发者能够高效构建安全、可 阅读详情

#背景
项目使用了springframework.security

接口入参使用了springframework.security 注解 @AuthenticationPrincipal

 /**
     * 获得个人资料
     */
    @PostMapping(value = "/getUserPersonalInfo", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @PermissionCheck(value = "ROLE_USER")
    public String getUserPersonalInfo(@AuthenticationPrincipal Principal principal){
        String username = principal.getName();
        try {
            DataMap data = userService.getUserPersonalInfoByUsername(username);
            return JsonResult.build(data).toJSON();
        } catch (Exception e){
            log.error("[{}] get user personal info exception", username, e);
        }
        return JsonResult.fail(CodeType.SERVER_EXCEPTION).toJSON();
    }

注解失效,前端请求接口的时候发现

Principal 为空

问题排查

这个问题不复杂, String username = principal.getName(); 报NPE

spring security 框架未处理 principal.setName() 的逻辑,具体代码位置不分析了,

一般分布式项目很少使用 security 框架,基本上都是基于jwt + redis 实现分布式登录验证,验证的逻辑放在网关里。

怎么解决

排查了 注解 @AuthenticationPrincipal 使用方法

发现一篇文件介绍 spring security 怎么获取用户的登录信息

发现了新的主键:

@CurrentSecurityContext

用法:


    /**
     * 获得个人资料
     */
    @PostMapping(value = "/getUserPersonalInfo", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @PermissionCheck(value = "ROLE_USER")
    public String getUserPersonalInfo(@CurrentSecurityContext(expression = "authentication")  Authentication authentication){
        String username =authentication.getName();
        try {
            DataMap data = userService.getUserPersonalInfoByUsername(username);
            return JsonResult.build(data).toJSON();
        } catch (Exception e){
            log.error("[{}] get user personal info exception", username, e);
        }
        return JsonResult.fail(CodeType.SERVER_EXCEPTION).toJSON();
    }

这个是经过2这个小时的排查的结果

期间 使用了简单直接的方法获取用户信息

  Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String loginName = auth.getName();

想着如果spring security 框架没有自己处理,是不是自己写一个拦截器处理,或者是不是需要自己实现spring security 中自定义拦截器
后边发现或许是项目中的 spring security 版本升级导致,查看了maven 中的版本已经升级到了5.0

参考资料:参考资料一

参考资料二

转载于:https://www.fancv.com/article/1661265334

spirng框架之spring security(一) 自定义用户详情服务基于数据库实现登录认证及授权 阅读详情

相关推荐

Authentication—身份验证流程

本篇是对Shiro体系架构的介绍,本栏目大部分内容来自于Shiro官网。翻译过程中已经尽量保证用词的准确性和易懂性,如有不准确或者不确切的地方,请联系作者加以修改。本篇内容翻译自Authentication特征与Authentication官方指南。 Authentication是身份验证的过程,即证明该用户是否合法,对于证明一个用户是否合法,用户需要提供一些身份识别信息,以及系统能信任的身份证...

微服务技术栈 7326

spring security-@AuthenticationPrincipal注解

AuthenticationPrincipal注解是Spring Security框架提供的一个注解,用于获取当前用户的认证信息。它可以用于方法参数上,表示将当前用户的认证信息注入到该参数中。通常情况下,我们可以使用它来获取当前用户的用户名、角色、权限等信息,以便进行业务逻辑的处理。

dijia_todey的博客 2541

Spring Security 6.x 整合 OAuth 2.1:构建企业级认证授权方案实战

在Web应用开发中,认证与授权是保障系统安全的核心机制。认证负责验证用户身份,授权则决定其可访问的资源与操作。JWT作为一种广泛使用的无状态令牌技术,是实现分布式系统安全通信的关键。其原理是基于数字签名,确保信息在传输过程中不被篡改,具有自包含、易于跨域等优势。结合OAuth 2.0/2.1协议,能够为应用提供安全的第三方授权和单点登录能力,其技术价值在于构建标准化、可扩展的安全体系。在微服务、前后端分离及开放平台等场景下,这种组合方案尤为重要。本文聚焦于使用Spring Security 6.x框架,深度

weixin_30561177的博客 492

springsecurity 中获取用户信息

一、使用注解 @AuthenticationPrincipal @GetMapping("/user") public String user(@AuthenticationPrincipal Principal principal, Model model){ model.addAttribute("username", principal.getName()); return "user/user"; } @AuthenticationPrinc

Soul space of Jamon_Wang 3237

Spring Boot整合OAuth2:从授权协议到微服务安全实战

在现代应用开发中,授权是保障系统安全与用户体验的核心环节。OAuth2作为一种行业标准的授权协议,其核心原理在于通过令牌(Token)机制,允许第三方应用在用户授权后访问其资源,而无需获取用户密码,从而实现了认证与授权的安全解耦。这一机制的技术价值在于提供了安全、标准化的授权流程,极大地简化了多平台登录、API资源访问等场景的开发复杂度。其典型的应用场景包括第三方登录(如微信、GitHub登录)、微服务间的安全通信以及构建统一单点登录(SSO)系统。本文聚焦于如何在Spring Boot生态中高效整合OAu

weixin_34275734的博客 496

Spring Boot集成Keycloak实现细粒度API权限控制实战指南

在微服务架构中,API访问权限管理是保障系统安全的核心环节。其基本原理是通过身份认证与授权机制,验证请求的合法性并控制资源访问范围。传统基于角色的访问控制(RBAC)在应对多租户、动态策略等复杂场景时,常面临权限硬编码、维护困难等挑战。OAuth 2.0和OpenID Connect作为现代授权框架,通过引入授权服务器,实现了认证与授权的解耦,为细粒度、动态化的权限管理提供了标准方案。Keycloak作为开源的身份和访问管理(IAM)解决方案,内置了完整的OAuth 2.0和OpenID Connect支持

weixin_33778544的博客 389

Spring Boot OAuth2整合实战:从第三方登录到API安全防护

OAuth2作为现代应用授权的工业标准协议,其核心思想是‘授权而非认证’,通过定义资源所有者、客户端、授权服务器和资源服务器四个角色间的标准化交互流程,解决了应用间安全访问用户资源的问题。该协议基于授权码、密码、客户端凭证和隐式四种模式,其中授权码模式因其通过前端信道传递授权码、后端信道交换令牌的安全机制,成为Web应用整合第三方登录的主流选择。在技术实现层面,Spring Security框架提供了对OAuth2协议的全面支持,通过自动配置和声明式安全规则,开发者能够高效构建安全的认证授权基础设施。这种整

weixin_30698527的博客 400

Token技术全解析:从JWT到OAuth 2.0的安全实践与避坑指南

在现代分布式系统和微服务架构中,身份认证与授权是保障应用安全的核心机制。其基本原理是通过令牌(Token)作为访问凭证,替代传统的会话管理,实现无状态、可扩展的认证方案。从技术价值看,Token机制不仅解决了跨域访问和移动端兼容性问题,还通过加密签名和有效期控制提升了整体安全性。典型的应用场景包括用户登录认证、API接口鉴权以及服务间通信。本文聚焦于JWT和OAuth 2.0这两种主流Token方案,通过Spring Boot实战演示了Token的生成、验证与资源服务器配置,并针对常见的“token exc

weixin_30301449的博客 416

Spring Boot与Vue集成CAS单点登录:从原理到企业级实践

单点登录(SSO)是现代企业应用架构中解决多系统统一认证的核心技术,其核心原理是通过一个中央认证服务,实现用户一次登录即可访问所有相互信任的应用系统。CAS(Central Authentication Service)作为实现SSO的经典开放协议,通过TGT、TGC和ST等关键票据机制,在保障安全的前提下,完成了认证与应用的解耦,极大地提升了用户体验与系统管理效率。在企业级开发中,结合Spring Boot快速构建后端服务和Vue构建现代化前端已成为主流技术选型。本文将深入解析CAS 3.0协议的工作流程

weixin_30216561的博客 401

Spring Security 6.x 系列【63】扩展篇之匿名认证

一般在应用系统中,除了登录、主页外,其他都需要用户经过认证才能访问。一般都采用deny-by-default(默认拒绝)来设置访问控制策略。即明确规定允许哪些可以直接访问,除此之外的都需要认证授权。 在Spring Security中,会将未认证的请求都设置为匿名认证用户,提供了一种更方便的方式来配置访问控制属性。另一方面,未认证时,SecurityContextHolder中也总是包含一个匿名的Authentication对象,避免为NULL,增强了代码健壮性。

记录知识、锤炼自我 1737

天池长期赛:二手车价格预测(422方案分享)

本次比赛是一次很好的锻炼数据挖掘能力的入门赛,从EDA-数据清洗-特征工程-模型调参-模型融合,能够完整的学习到大数据的分析和挖掘,值得历练。

weixin_46685991的博客 1万+

SpringBoot体育场地预约系统:毕业设计与实战全流程拆解

在Java企业级开发领域,SpringBoot框架因其快速构建和简化配置的特性,已成为构建Web应用的主流选择。其核心原理在于通过自动配置和起步依赖,极大降低了项目初始化的复杂度,使开发者能聚焦于业务逻辑实现。这一技术价值在于提升了开发效率,并保证了项目结构的标准化与可维护性。典型的应用场景包括各类后台管理系统、电商平台及在线服务系统,其中,具备并发处理和复杂业务规则的系统最能体现其优势。本文以体育场地预约系统为例,深入探讨了如何运用SpringBoot处理时间冲突校验、状态机管理等核心业务难点,并详细解析

weixin_34343000的博客 335

淘宝电商产品价格官方防爬取采集设计机制,如何破?|淘宝电商API数据采集看完你也会!

然而,随着电子商务的蓬勃发展,涌现出大量的第三方工具和应用,试图通过采集淘宝电商产品价格等信息来进行数据分析和竞争优势的获取。为了维护市场秩序和保护商家权益,淘宝采取了一系列的防爬取设计机制,以阻止非授权的数据采集行为。为了确保数据的准确性和及时性,淘宝采取了多层次的防爬取机制,以限制未经授权的数据采集。其它的情况,比如淘宝首页、淘宝关键词商品搜索结果页面、商品详情页面,都是正常展示,未实现加密;也可以使用【tesseract ocr识别】指令,这个是免费无限使用的;【淘宝商品搜索结果页面-本地截图】

TinagirlAPI的博客 1385

OAuth2.0与JWT实战:从授权原理到微服务安全架构落地

在现代Web应用与微服务架构中,身份认证与授权是保障系统安全的核心基石。OAuth2.0作为一种标准的授权框架,其核心原理在于解决第三方应用在无需获取用户密码的前提下,安全地获取用户资源访问权限的问题。它通过定义授权码、隐式等多种模式,适应了Web、移动端及服务间通信等不同场景,提供了灵活且安全的授权流程。而JWT作为一种紧凑且自包含的令牌格式,其技术价值在于实现了无状态的身份信息传递,服务端无需维护会话状态,仅通过验证签名即可确认令牌有效性,极大地提升了分布式系统的扩展性与性能。两者的结合,即由OAuth

weixin_33871366的博客 389

绕过App某加密企业版加固Frida检测

可以发现dlsym函数加载了两次pthread_create,可以认为这两个进程(或某一个进程)是和Frida的检测有关的,于是为了绕过检测,我们可以让它加载一个虚假的pthread_create函数,得到一个空结果绕过检测。成功绕过了libnllvm1717052779924.so的检测,又到了libface_nllvm.so的检测,使用同样的方法去绕过libface_nllvm.so的检测,代码我这里就不上了,大家可以自己修改以下。dlsym()函数的作用是在已经加载的动态链接库中查找指定符号的地址。

墨痕诉清风的博客 1621

基于Python的车牌识别系统实现

本文将以基于Python的车牌识别系统实现为方向,介绍车牌识别技术的基本原理、常用算法和方法,并详细讲解如何利用Python语言实现一个完整的车牌识别系统。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 5万+

Spring Security:身份验证令牌Authentication介绍与Debug分析

它是接口的基类,使用此类的实现应该是不可变的(模板模式)。-- -- > // 权限列表 private final Collection < GrantedAuthority > authorities;// 存储有关身份验证请求的其他详细信息,可能是IP地址、证书序列号等 private Object details;// 是否已验证,默认为false private boolean authenticated = false;/*** 使用提供的权限列表创建一个身份验证令牌。

写写平时的技术与感想 2854

GPU硬件架构与微架构深度解析09-GPU寄存器文件深度解析

本文探讨GPU架构中大规模寄存器堆的设计与高效分配算法。寄存器文件作为GPU关键组件,支持大规模线程并行和快速数据存取。文章分析了多体寄存器堆的设计考量,包括端口数量、冲突避免和功耗管理,并比较了线性扫描、图着色等寄存器分配算法的特点。还介绍了寄存器压缩、动态分区等高级优化技术,以及NVIDIA Ampere架构的实际案例。这些技术对提升GPU计算性能和能效至关重要。

2301_79143213的博客 120

配置Spring Security AuthenticationFilter和AuthenticationPrincipal

5.自定义Spring Security AuthenticationFilter 最后,让我们编写JWTAuthenticationFilter从请求中获取 JWT 令牌,对其进行验证,加载与令牌关联的用户,并将其传递给 Spring Security - public class JwtAuthenticationFilter extends OncePerRequestFilter { @Autowired private JwtTokenProvider tokenProvi

qiuweifan的博客 2724

T507 buildroot linux4.9之RLT8211F 1000M以太网开发调试

调试T507的gmac,解决该RTL8211F 1000m以太网中调试遇到的问题

目前从事linux驱动开发,多交流多学习吧 686

正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真

调节方波信号的占空比,也就是改变输出信号的高低电平时间比例,可以设置电容不同的充放电时间来达到目的,RP2可以使得电容具有不同的充放电时间,其中二极管起到限制电流流向的作用。假设U+>U,那么输出端就达到正向饱和,电容开始充电,当电容电压大于同相输入端电压时,此时电容开始放电,由此往复,从而产生方波信号。3,正反馈支路占优势,电路开始起振并不是稳定的,振荡会不断增大,最终将导致运放饱和,输出的波形是削波失真的正弦波。通常在电路中引入负反馈,例如使用负温度系数的热敏电阻,以自动稳定增益,防止输出波形失真。

XU157303764的博客 5318

Spring Security用户认证和权限控制(默认实现)

1 背景 实际应用系统中,为了安全起见,一般都必备用户认证(登录)和权限控制的功能,以识别用户是否合法,以及根据权限来控制用户是否能够执行某项操作。 Spring Security是一个安全相关的框架,能够与Spring项目无缝整合,本文主要是介绍Spring Security默认的用户认证和权限控制的使用方法和原理,但不涉及到自定义实现。 Spring Security用户认证和权限控制(自定义实现)这篇文章专门讲解用户认证和权限控制相关的自定义实现。 2 实战示例 2.1 创建工程 创建一个

jingke_1524的博客 1559

RK3588 部署 YOLOv5s 实战:多线程加速从 16FPS 飙升到 120FPS(含性能优化)

因为RK3588包含了3个NPU核心,支持3个核心同时工作、双核合作、以及单核工作。我们可以使用线程池来加速。线程池是一种长街的并发编程模型,它用于管理和复用线程,以提高多线程程序的性能和效率。线程池通常包含以下主要组件:1、任务队列:任务队列用于存储待执行的任务。这些任务可以是函数、方法或其他需要多线程环境中执行的操作。2、线程池管理:线程池管理器负责创建、销毁和管理线程。它会监视任务队列中的任务,根据需要创建线程,执行任务,并在任务完成后将线程放回池中以供重用。

FJN110的博客 99

springboot集成springsecurity简单权限管理与logout退出,@AuthenticationPrincipal

springsecurity主要是 认证 (密码登录) 与 授权 (角色权限管理) 下面一个简单项目例子,使用springsecurity MyUserDetailsService#loadUserByUsername 用户登录 SecurityConfig#configure 配置springsecurity行为 Controller中的@PreAuthorize就是用户权限 对照上图看,权限...

老专家的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

​Authentication​ 和 ​Principal​ 的区别和联系

在Spring Security中,它可以是用户名、电子邮件地址、唯一标识符或其他任何可以用来标识用户的信息。都是Spring Security用于实现用户认证和授权的重要组件,它们的共同目标是确保只有经过身份验证和授权的用户才能访问受保护的资源。通常用于整个认证和授权过程,它包含了用户认证的全部信息,可以用于判断用户是否已经通过认证、获取用户的权限等。的主要功能是提供用户认证的信息,包括用户是否已经通过认证、用户的身份信息、用户所拥有的权限等。的主要功能是提供用户的身份信息,用于标识和区分不同的用户。

yyzz7579的博客 631

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring Security里的authentication中加入自定义的内容

转载自:https://www.nbucedog.com/blog/article/8 叙述 当Spring security认证成功了之后会返回一个authentication,里面包含一些用户的认证信息。但有时候里面已有的信息并不能满足我们的需求,比如说当我们使用org.springframework.security.core.userdetails.User这个类的时候 代码 @...

lizhengyu891231的博客 3159

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 疑难问题:JDK 1.8 java.lang.IllegalStateException信息排查
下一篇: TCC-Transaction Dubbo 项目 demo
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值