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

Vaadin21迁移至基于视图的访问控制后@RolesAllowed注解失效

问题根因与修复方案

你遇到的@RolesAllowed不生效问题,是Vaadin 21 + Spring Security组合下的两个常见配置遗漏导致的:

  1. 未开启JSR-250注解支持
    @RolesAllowed属于JSR-250标准安全注解,需要显式开启支持才会被Spring Security识别。你当前的安全配置类仅添加了@EnableWebSecurity,缺少方法安全的注解配置。
    修复方法:给SecurityConfiguration类添加@EnableGlobalMethodSecurity(jsr250Enabled = true)注解,修改后类头部代码如下:
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SecurityConfiguration extends VaadinWebSecurityConfigurerAdapter {
    // 原有代码无需改动
}

注:如果后续升级到Spring Security 6+版本,将上述注解替换为@EnableMethodSecurity(jsr250Enabled = true)即可。

  1. Spring Security角色前缀不匹配
    Spring Security默认对角色校验添加ROLE_前缀,你当前配置的@RolesAllowed("admin")会自动匹配权限为ROLE_admin的用户。如果你自定义的UserDetailsService返回的用户权限仅为字符串admin,没有对应前缀,就会校验失败。
    两种可选修复方式:
  • 方式1:调整权限生成逻辑,给所有角色权限添加ROLE_前缀。比如在UserDetailsService实现中,构造SimpleGrantedAuthority时传入"ROLE_" + 角色名
  • 方式2:取消默认角色前缀要求,在SecurityConfiguration中添加如下Bean即可:
@Bean
public GrantedAuthorityDefaults grantedAuthorityDefaults() {
    // 配置空字符串作为默认角色前缀
    return new GrantedAuthorityDefaults("");
}

完成上述配置后重启应用,拥有对应角色的用户即可正常访问受限路由。

内容的提问来源于stack exchange,提问作者Jonas TM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:42:01