Spring Boot 3升级后Waffle中AuthorizationHeader为空致认证失败求助
核心原因分析
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
相关产品推荐
相关产品推荐

