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

Spring Security凭证错误修复:服务器启动后登录始终失败

Spring 6 登录凭证错误+配置文件未加载排查方案

核心问题

  • 启动服务器后自动重定向到登录页,但所有凭证均提示错误
  • 注释application.properties中的密码配置后,控制台未生成Spring Security默认自动密码,怀疑配置文件未被读取
  • 涉及Spring 6中已废弃的Security配置方法

排查步骤与解决办法

1. 确认application.properties是否正常加载

直接在配置类中注入Environment验证配置项:

@Autowired
private Environment env;

@PostConstruct
public void checkConfigLoad() {
    System.out.println("加载的用户密码:" + env.getProperty("spring.security.user.password"));
}

如果打印为空,排查以下点:

  • 配置文件是否放在src/main/resources目录下
  • 文件名是否正确(必须是.properties后缀,而非.property)
  • 多环境场景下是否激活了正确的profile

2. 替换Spring 6中废弃的Security配置代码

WebSecurityConfigurerAdapter已被废弃,改用组件式配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    private final AppUserService appUserService;

    public WebSecurityConfig(AppUserService appUserService) {
        this.appUserService = appUserService;
    }

    @Bean
    public UserDetailsService userDetailsService() {
        return appUserService;
    }

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

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

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .permitAll() // 允许登录页匿名访问
            )
            .logout(logout -> logout
                .permitAll()
            );
        return http.build();
    }
}

3. 保证密码配置与编码一致性

  • 若使用配置文件中的默认用户(spring.security.user.name/spring.security.user.password):Spring 6默认用DelegatingPasswordEncoder处理明文密码,但自定义UserDetailsService时,必须自行处理编码逻辑
  • 注释密码配置后无自动密码生成:说明自定义UserDetailsService覆盖了默认用户配置,此时Spring不会生成默认用户,需检查AppUserService的用户查询逻辑

4. 排查AppUserService实现问题

确保loadUserByUsername逻辑正确,密码为加密后的值:

@Service
public class AppUserService implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 替换为实际的用户查询逻辑
        if (!"admin".equals(username)) {
            throw new UsernameNotFoundException("用户不存在");
        }
        // 密码需为提前加密后的字符串(示例为明文"123456"的BCrypt加密值)
        return User.withUsername("admin")
            .password("$2a$10$Z8HxQx9e7R7yW5t6U4i3O2p1q0r9s8d7f6g5h4j3k2l1m0n")
            .roles("ADMIN")
            .build();
    }
}

注意:禁止在loadUserByUsername中每次加密密码,需提前将加密后的密码存储到数据库或配置中,否则每次验证时密码会重新加密,导致匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:07:33