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
相关产品推荐
相关产品推荐

