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

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 392

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

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

weixin_34343000的博客 335

麒麟V10(arm)配置本地离线yum源

麒麟V10(arm)配置本地离线yum源

myfm2java的博客 7885

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

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

weixin_33871366的博客 389

服务器基础知识介绍

服务器,不仅仅是一台高性能计算机,更是网络的核心节点,承担着网络服务的责任。然而,相较于普通计算机,服务器对于稳定性、安全性和性能等方面提出了更高的要求,这使得它们在数字化浪潮中傲然独立。在硬件成本结构中,CPU和芯片组占据约50%的成本,内存占15%,外部存储占10%,其余硬件约占25%。服务器的逻辑结构与普通计算机相似,但由于其需要提供高性能计算,对稳定性、可靠性、安全性、可扩展性和可管理性的要求更高。服务器的分类多种多样,根据产品形式可分为塔式服务器、机架服务器、刀片服务器和机柜服务器。

m0_73576645的博客 1880

保姆级教程:手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动

本文提供了一份详细的保姆级教程,手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动。从基础配置到RGMII接口的特殊设置,再到驱动开发的关键步骤和调试技巧,帮助开发者快速掌握PHY芯片的移植与开发。

weixin_33734785的博客 333

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

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

写写平时的技术与感想 2854

Grok 3国内怎么用?超详细使用指南+实用指令模板

主要是用于快速分析学术论文,提取关键信息,总结研究成果。Analyze the following research paper: [粘贴或上传论文内容]1. Extract key findings, methodologies, and conclusions. (提取主要发现、方法和结论。2. Identify statistical significance and data points. (识别统计显著性和数据点。

Survivor_sl的博客 1万+

配置Spring Security AuthenticationFilter和AuthenticationPrincipal

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

qiuweifan的博客 2724

ShardingSphere 分库分表避坑:扩容数据迁移时,如何做到“不停机、不丢数据”?

停机:发布公告,凌晨 0 点停止对外服务。洗数据:跑一个巨大的脚本,把旧库数据 Hash 算出新路由,写入新库。改配置:修改代码里的分片规则。重启:祈祷数据没丢,服务正常。这种“刀耕火种”的方式,风险极高,且随着数据量增大,停机时间会变得不可接受。我们需要的是Online Migration (在线迁移)。分库分表扩容不再是“听天由命”的赌博。通过,我们将一次高风险的“运维操作”变成了一个可控的、可视化的“数据流转过程”。方案停机时间复杂度回滚难度传统停机清洗。

BUG猿的博客 882

数据资产可视化分析:PowerBI在大数据管理中的实战

目的:帮你搞懂“为什么数据资产需要可视化?”“PowerBI能帮企业解决什么问题?”,并掌握用PowerBI做大数据可视化的实战技巧。范围:覆盖数据资产定义、可视化分析原理、PowerBI核心功能(数据连接、建模、可视化)、零售企业实战案例,以及未来趋势与挑战。背景:为什么企业的数据像乱堆的玩具?核心概念:数据资产、可视化分析、PowerBI分别是什么?它们怎么配合?实战步骤:用PowerBI帮零售企业整理“销售玩具箱”,做出能指导决策的仪表盘;应用场景:不同部门怎么用这个“整理好的玩具箱”?

2501_92132293的博客 906

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

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

jingke_1524的博客 1559

杰理接入第三方升级协议OTA教程

本教程介绍了使用dual_bank_updata_api.h接口接入第三方协议进行固件升级的方法。主要内容包括:INI配置要求(需启用双备份并强制4K对齐)、7个核心API接口功能说明及参数详解(初始化、空间检查、数据写入、校验等)、标准升级流程步骤(初始化→检查→写入→校验→引导→清理)。特别强调了4K对齐配置的重要性以避免数据丢失,并提供了被动升级流程图。该方案支持用户自定义协议接入,需严格按照流程调用接口完成升级。

qq_42014563的博客 1429

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

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

老专家的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

yyzz7579的博客 631

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

lizhengyu891231的博客 3159

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 疑难问题: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、付费专栏及课程。

余额充值