部署Spring Security应用至WildFly后遇AuthenticationCredentialsNotFoundException异常
解决Spring Boot部署到WildFly后出现AuthenticationCredentialsNotFoundException的问题
嗨,我之前把Spring Boot应用部署到WildFly时也踩过这个认证异常的坑,咱们一步步来排查和解决这个问题:
1. 先确认请求是否携带了正确的认证凭证
这个异常最直接的原因就是请求没带上Spring Security能识别的认证信息,导致SecurityContext里找不到Authentication对象:
- 如果用HTTP Basic认证,要确保请求头里包含
Authorization: Basic <base64编码的用户名:密码>,可以用curl快速测试:curl -u your-username:your-password http://your-wildfly-host:8080/your-protected-endpoint - 如果是Token类认证(比如JWT),要保证请求头里带了对应的Token字段(比如
Authorization: Bearer <your-token>)。
2. 检查Spring Security配置是否适配WildFly环境
Spring Boot默认的Security配置在嵌入式Tomcat里没问题,但部署到WildFly这种Java EE容器时,得调整配置避免冲突:
- 确保你的Security配置类正确启用了Web安全,并且配置了适合REST服务的认证方式,示例代码:
@Configuration @EnableWebSecurity @EnableMethodSecurity // 要使用@PreAuthorize等方法级注解的话必须加这个 public class SecurityConfig { @Autowired private UserDetailsService customUserDetailsService; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) // REST服务通常禁用CSRF保护 .authorizeHttpRequests(auth -> auth .requestMatchers("/public/**").permitAll() // 开放公共路径 .anyRequest().authenticated() ) .httpBasic(withDefaults()); // 启用Basic认证,可根据需求替换为Token认证 return http.build(); } @Bean public AuthenticationProvider authenticationProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); authProvider.setUserDetailsService(customUserDetailsService); authProvider.setPasswordEncoder(passwordEncoder()); return authProvider; } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } - 确认你的
UserDetailsService实现类已经正确注册为Bean,并且能根据用户名返回有效的UserDetails对象。
3. 排查WildFly容器的安全配置冲突
WildFly自带的Java EE安全机制可能会和Spring Security产生冲突:
- 检查war包中是否存在
web.xml,如果里面配置了security-constraint或者login-config,可能会先于Spring Security拦截请求,导致认证信息无法传递给Spring Security。如果不需要WildFly的原生安全,建议移除这些配置。 - 确保Spring Boot的war包正确排除了嵌入式Tomcat依赖,避免和WildFly的Servlet容器冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency>
4. 开启Spring Security日志排查细节
如果上面的步骤都没解决问题,开启Debug日志能帮你看清认证流程的每一步:
在application.properties中添加:
logging.level.org.springframework.security=DEBUG
启动WildFly后查看日志,你能看到:
- 系统是否接收到了请求的认证凭证
UserDetailsService是否被正常调用- Authentication对象是否被生成并放入SecurityContext
按照这个流程排查,应该能快速定位到问题所在。
内容的提问来源于stack exchange,提问作者Savita Singh
相关产品推荐
相关产品推荐

