Vaadin 14升级至23后路由异常,关联权限注解问题
Vaadin 23升级后@Secured/@RolesAllowed视图RouterLink导航404问题解析
核心原因
Vaadin 23在安全机制与路由的整合逻辑上和Vaadin 14存在显著差异,导致带权限注解的视图出现404:
- 安全注解依赖配置变更:Vaadin 23更依赖Spring Security的原生方法级安全支持,若未在Spring Security配置中启用
@Secured和@RolesAllowed的支持,这些注解会直接失效,视图会被判定为“未授权访问”,但路由系统会返回404而非明确的权限不足提示。 - 路由导航权限校验时机提前:Vaadin 23中RouterLink导航时会预先校验用户权限,若用户无对应角色,路由系统会直接判定路径不存在(返回404);而Vaadin 14是先完成导航再执行权限校验,因此不会出现404,而是展示权限错误提示。
- @AnonymousAllowed的特殊性:该注解会完全跳过权限校验,视图能被路由系统正常识别,因此导航流程可正常执行。
解决步骤
启用Spring Security方法级安全
在Spring Security配置类上添加注解,开启@Secured和@RolesAllowed的支持:@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true) public class SecurityConfig extends VaadinWebSecurity { // 自定义配置内容 }确认用户角色匹配
确保当前登录用户拥有目标视图注解中指定的角色,比如@Secured("ADMIN")要求用户必须具备ADMIN角色。正确配置Vaadin安全路径
确保Spring Security放行Vaadin的内部请求和必要路径,示例配置(基于SecurityFilterChain):@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .requestMatchers(VadinWebSecurity::isFrameworkInternalRequest).permitAll() .anyRequest().authenticated() ); http.formLogin(form -> form.loginPage("/login").permitAll()); http.logout(logout -> logout.logoutSuccessUrl("/login")); VaadinWebSecurity.configure(http); return http.build(); }自定义权限不足处理
若希望替换404为明确的权限提示,可配置AccessDeniedHandler:@Bean public AccessDeniedHandler accessDeniedHandler() { return (request, response, accessDeniedException) -> { response.sendRedirect("/access-denied"); // 或跳转至自定义Vaadin权限提示视图 }; }然后在SecurityFilterChain中添加:
http.exceptionHandling(ex -> ex.accessDeniedHandler(accessDeniedHandler()));
内容的提问来源于stack exchange,提问作者Tomás Atrat
相关产品推荐
相关产品推荐

