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

Spring Security中UserDetails无法转换为自定义User实现类报错如何解决

问题根因

你遇到的类型转换异常核心有两个原因:

  1. authentication.getPrincipal()返回的根本不是你自定义的nl.teamrepositories.vliegmaatschappij.security.domain.User实例,而是Spring Security内置的org.springframework.security.core.userdetails.User对象
  2. Spring Boot DevTools的类加载器隔离机制,导致两个类被不同的类加载器加载,就算类路径完全一致也会出现转换失败的问题

解决步骤

1. 修正UserDetailsService实现逻辑

绝大多数该类问题都是因为你自定义的UserDetailsService的loadUserByUsername方法,查询到你的自定义User对象后,没有直接返回,而是手动构建了Spring内置的User对象返回,示例错误写法如下:

// 错误示例
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    // 这里已经查到了你自己的自定义User对象
    nl.teamrepositories.vliegmaatschappij.security.domain.User user = userRepository.findByUsername(username).orElseThrow();
    // 错误:返回了Spring内置的User实例,导致后续转换失败
    return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.getAuthorities());
}

直接修改为返回你查询到的自定义User实例即可:

// 正确写法
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    nl.teamrepositories.vliegmaatschappij.security.domain.User user = userRepository.findByUsername(username)
            .orElseThrow(() -> new UsernameNotFoundException("用户名不存在"));
    return user;
}

2. 处理DevTools类加载器问题

报错信息里明确提示两个类分别被app类加载器和DevTools的RestartClassLoader加载,你可以二选一处理:

  • 快速解决方案:直接从项目的依赖配置(pom.xml/build.gradle)中移除spring-boot-devtools依赖,重启项目即可
  • 兼容DevTools方案:在resources/META-INF目录下新建spring-devtools.properties文件,添加如下配置,将你自定义的安全相关类纳入应用类加载器加载范围:
restart.include.security=/nl/teamrepositories/vliegmaatschappij/security/.*

3. 可选:增加类型校验增强健壮性

可以在转换前先做类型判断,避免未覆盖的场景直接抛出运行时异常:

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
                                        FilterChain filterChain, Authentication authentication) {
    Object principal = authentication.getPrincipal();
    if (principal instanceof User) {
        User user = (User) principal;
        // 原有业务逻辑
    } else {
        // 异常处理逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:15:03