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

Spring Security中CustomUserDetailsService无法自动装配问题求助

问题原因及解决方案

核心问题

你遇到的注入错误,根源在于自定义的CustomUserDetailsService接口没有被实现类正确实现,导致Spring容器中不存在该类型的Bean。

看原代码的实现类:

@Service
class CustomUserDetailsServiceImpl(val accountService:AccountService): UserDetailsService {
    // ...实现代码
}

这里CustomUserDetailsServiceImpl直接实现的是Spring Security的UserDetailsService接口,而非你自己定义的CustomUserDetailsService接口。这意味着Spring容器中只会存在一个UserDetailsService类型的Bean,而没有CustomUserDetailsService类型的Bean,所以在SecurityConfig中注入CustomUserDetailsService时会提示找不到对应类型的Bean。

而你修改后的代码,直接把实现类命名为CustomUserDetailsService并标注@Service,此时这个类本身就是一个被Spring管理的Bean,类型就是CustomUserDetailsService,所以注入时能正常匹配。

正确的常规写法(保留接口+实现类的模式)

如果你想保留接口和实现类的分离结构,只需要让实现类实现你自定义的CustomUserDetailsService接口即可:

interface CustomUserDetailsService: UserDetailsService {
    override fun loadUserByUsername(username: String?): CustomUserDetails
}

@Service
// 改为实现自定义的CustomUserDetailsService接口
class CustomUserDetailsServiceImpl(val accountService:AccountService): CustomUserDetailsService {
    override fun loadUserByUsername(username: String?): CustomUserDetails {
        try {
            val account = accountService.findByEmail(username!!)
            return CustomUserDetails(account)
        } catch (e: Exception) {
            throw e
        }
    }
}

这样Spring容器中就会存在一个CustomUserDetailsService类型的Bean(由CustomUserDetailsServiceImpl实例化),注入时就能正常匹配。

为什么JwtService没有问题?

你提到的JwtService应该是直接用@Service标注的类(没有额外的接口,或者实现了自己的接口且实现类正确关联),所以Spring容器中存在对应类型的Bean,注入时自然不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:45:03