You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@MappedSuperclass时@AuthenticationPrincipal无法填充父类字段问题

问题原因分析
  • 父类字段访问权限限制:如果BaseEntity中的id字段是private修饰,Spring Security从SecurityContext反序列化用户对象时,无法直接访问父类的私有字段,导致id无法被正确赋值。而将id直接定义在User类中时,字段的访问权限(比如protected/public,或者配套了getter/setter方法)能被Spring Security正常识别,所以可以填充值。

  • 序列化范围未包含父类字段:若你的User类实现了UserDetails接口,Spring Security默认用自身序列化机制存储用户信息。如果BaseEntity的id字段没被纳入序列化范围——比如没加@JsonProperty(用Jackson序列化的场景),或者没有对应的getter方法——反序列化时就无法还原这个字段,最终id为null。

  • UserDetailsService加载逻辑遗漏:在实现UserDetailsService的loadUserByUsername方法时,从数据库查询User对象后,可能没确保BaseEntity的id被正确加载。比如JPA查询时,虽然默认会加载所有字段,但某些复杂关联查询或自定义查询可能遗漏了id字段的映射,导致注入后id为空。

  • 类型转换时未复制父类字段:如果自定义了UserDetails实现类,和JPA的User实体是分离的,那么在通过@AuthenticationPrincipal注入时,类型转换过程中可能没把父类BaseEntity的id字段值复制过来,导致注入的User对象id为null。


内容的提问来源于stack exchange,提问作者Prototype

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:23:12