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

部署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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:06:51