SecurityContextHolder.getContext().getAuthentication()显示anonymousUser匿名用户问题

项目场景:在使用Spring security做用户认证从SecurityContextHolder中获取用户信息时,遇见如下问题:

分析原因:获取不到登录时储存的用户信息,猜测可能是在执行完某些操作之后将用户信息替换或者直接清空了。查看SecurityContextHolder的api发现里面有个clearContext()方法,通过debug模式发现当执行完org.springframework.security.web.context.SecurityContextPersistenceFilter和org.springframework.security.web.FilterChainProxy过滤器时会调用SecurityContextHolder.clearContext()方法把SecurityContextHolder清空,所以获取不到存储的用户信息。

解决方案:找到了问题所在就好解决了,可以自定义过滤器重新保存用户认证信息,如代码中自定义的MyAuthenticationTokenGenericFilter

改进之后的结果如下:

需要注意的是,如果需要用到权限认证,还需保存用户的权限信息,我这里暂时不用,所以没保留,只需要替换成这个构造函数就可以new UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities)

posted @   聚散彡流沙  阅读(14018)  评论(4编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示