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

如何在Vaadin 23.3中正确使用Spring Security的RoleHierarchy?

Vaadin 23.3中RoleHierarchy不生效的问题修复

你的问题出在两个核心点:配置顺序错误,以及**@RolesAllowed注解的权限校验依赖方法安全配置,而非HttpSecurity的请求授权配置**。

1. 错误原因拆解

  • 你先设置http.authorizeRequests().expressionHandler(expressionHandler),随后调用super.configure(http),但VaadinWebSecurity的父类configure方法会重新初始化请求授权相关配置,直接覆盖了你之前设置的表达式处理器。
  • @RolesAllowed属于方法级安全注解,它的权限校验由Spring Security的方法安全处理器负责,仅配置HttpSecurity层面的表达式处理器无法触发角色层级逻辑。

2. 修复步骤

步骤一:配置全局方法安全的角色层级

创建继承GlobalMethodSecurityConfiguration的配置类,专门处理方法级安全的角色解析:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;

@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled = true) // 启用JSR-250规范的@RolesAllowed注解
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected DefaultWebSecurityExpressionHandler createExpressionHandler() {
        DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
        expressionHandler.setRoleHierarchy(roleHierarchy);
        return expressionHandler;
    }
}

步骤二:修正WebUISecurity的配置顺序

调整configure(HttpSecurity http)的执行顺序,确保自定义配置在父类基础配置之后生效:

public class WebUISecurity extends VaadinWebSecurity {
    // ...
    protected void configure(HttpSecurity http) throws Exception {
        // 先执行父类配置,初始化Vaadin安全框架的基础规则
        super.configure(http);
        
        // 配置请求授权的表达式处理器(针对URL路径的角色层级校验)
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
        DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
        expressionHandler.setRoleHierarchy(roleHierarchy);
        http.authorizeRequests().expressionHandler(expressionHandler);
        
        setLoginView(http, LoginView.class, "/ui/login");
    }
    // ...
}

3. 核心注意事项

  • 必须开启@EnableGlobalMethodSecurity(jsr250Enabled = true),Spring Security才能识别并处理@RolesAllowed注解。
  • 角色层级需要同时覆盖方法安全和请求授权两个场景,分别对应注解式权限和URL路径权限的校验。
  • 配置顺序不可颠倒:父类的configure(http)会初始化Vaadin专属的安全规则,必须先执行,否则自定义配置会被覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:17:56