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

Spring Security无法关闭自动密码生成及认证异常问题求助

问题分析

排除UserDetailsServiceAutoConfiguration后,Spring Security不再自动配置DaoAuthenticationProvider——这个组件是处理UsernamePasswordAuthenticationToken的核心认证提供者,它依赖UserDetailsService和PasswordEncoder完成用户校验逻辑。虽然你已经定义了这两个Bean,但未将它们注册到认证体系中,导致系统找不到对应的AuthenticationProvider。

解决方案

以下两种方式任选其一即可:

方式一:手动配置DaoAuthenticationProvider

修改SecurityConfig类,添加DaoAuthenticationProvider的Bean定义,并将其关联到你的UserDetailsService和PasswordEncoder,最后注入到HttpSecurity中:

@EnableWebSecurity
@Configuration
public class SecurityConfig {
    
    @Autowired
    Securityhandler successHandler;
    
    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsServiceImpl();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    // 新增:配置认证提供者
    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
        return authConfig.getAuthenticationManager();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // 将认证提供者加入HttpSecurity
        http.authenticationProvider(authenticationProvider());
        
        return http.csrf((csrf)->csrf.disable())
                .authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())
                .httpBasic(Customizer.withDefaults())
                .build();
    }
}

方式二:通过配置关闭默认用户生成(无需排除AutoConfiguration)

如果不想手动配置Provider,可以保留UserDetailsServiceAutoConfiguration,仅通过配置文件关闭自动生成默认用户的功能,这样既能禁用自动密码生成,又能保留Spring自动配置的认证提供者:
在application.properties中添加:

spring.security.user.enabled=false

然后移除启动类上的@SpringBootApplication(excludes = UserDetailsServiceAutoConfiguration.class)注解。

额外检查项
  • 确认UserRepository.getUserByUsername(username)能正常从数据库查询到用户数据
  • 数据库中存储的密码必须是BCryptPasswordEncoder加密后的字符串,明文密码会导致认证失败
  • 检查MyUserDetails中的isEnabled()等状态方法返回值是否符合业务逻辑(比如用户是否被禁用)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:20:10