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

Spring Boot 3升级后Waffle中AuthorizationHeader为空致认证失败求助

解决Waffle在Vaadin应用中Authorization头为空的认证问题

核心原因分析

Authorization头返回null的本质是:客户端未收到服务器返回的WWW-Authenticate: Negotiate响应,因此没有触发Windows集成认证流程,自然不会携带Authorization头发送请求。你的当前配置缺少认证入口点的绑定,同时过滤器执行顺序也存在问题。

具体解决步骤

1. 修正SecurityFilterChain配置,绑定认证入口点并调整过滤器顺序

修改SecurityConfiguration,确保将NegotiateSecurityFilterEntryPoint配置到异常处理逻辑中,同时调整过滤器的执行顺序:

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true)
@ComponentScan
public class SecurityConfiguration {

    @Autowired
    private NegotiateSecurityFilter negotiateSecurityFilter;

    @Autowired
    private NegotiateSecurityFilterEntryPoint entryPoint;
    
    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(requests -> requests
                // 排除Vaadin静态资源、图标等无需认证的路径
                .requestMatchers("/VAADIN/**", "/favicon.ico", "/robots.txt").permitAll()
                // 其余所有请求需要认证
                .anyRequest().authenticated()
            )
            // 绑定Negotiate认证入口点,未认证时返回WWW-Authenticate响应触发客户端认证
            .exceptionHandling(handling -> handling.authenticationEntryPoint(entryPoint))
            // 将Negotiate过滤器放在Basic认证过滤器之前,优先捕获Authorization头
            .addFilterBefore(negotiateSecurityFilter, BasicAuthenticationFilter.class)
            .headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin()))
            .csrf(csrf -> csrf.disable());

        return http.build();
    }
}

2. 验证Waffle核心组件的依赖配置

确保NegotiateSecurityFilter和NegotiateSecurityFilterEntryPoint的依赖注入正确,比如是否绑定了WindowsAuthProvider:

@Bean
public WindowsAuthProvider waffleAuthProvider() {
    return new WindowsAuthProvider();
}

@Bean
public NegotiateSecurityFilter negotiateSecurityFilter(WindowsAuthProvider authProvider) {
    NegotiateSecurityFilter filter = new NegotiateSecurityFilter();
    filter.setProvider(authProvider);
    return filter;
}

@Bean
public NegotiateSecurityFilterEntryPoint negotiateEntryPoint() {
    NegotiateSecurityFilterEntryPoint entryPoint = new NegotiateSecurityFilterEntryPoint();
    entryPoint.setProvider(new WindowsAuthProvider());
    return entryPoint;
}

3. 客户端浏览器配置检查

  • 将Vaadin应用地址添加到浏览器的本地Intranet区域(IE/Edge:Internet选项 -> 安全 -> 本地Intranet -> 站点 -> 添加)
  • 开启“自动登录到Intranet区域”选项(IE/Edge:Internet选项 -> 安全 -> 本地Intranet -> 自定义级别 -> 登录 -> 自动登录当前Intranet区域)

4. Vaadin请求适配确认

Vaadin使用AJAX和WebSocket通信,需确保这些请求能正确携带认证头:

  • 确认应用无跨域配置(同域场景无需额外处理)
  • Vaadin Flow 23+版本默认会携带认证头,旧版本可检查VaadinServletRequest是否正确传递原始请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:15:16