使用@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

