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

2q5ifsrm  于 2023-04-21  发布在  Spring
关注(0)|答案(1)|浏览(155)

我试图在Vaadin 23.3中使用RoleHierarchy

public class WebUISecurity extends VaadinWebSecurity {
    // ...
    protected void configure(HttpSecurity http) throws Exception {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
        DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
        expressionHandler.setRoleHierarchy(roleHierarchy);
        http.authorizeRequests().expressionHandler(expressionHandler);
        super.configure(http);
        setLoginView(http, LoginView.class, "/ui/login");
    }
    // ...
}

但是RoleHierarchy根本没有使用:当访问受限Vaadin视图时(@RolesAllowed("USER")),不会命中getReachableGrantedAuthorities(...)中的断点。
我做错了什么,或者在使用Vaadin时需要考虑什么?

axr492tv

axr492tv1#

事实证明,使用表达式处理程序的方法没有意义,因为@RoleAllowed-annotations是使用ViewAccessChecker检查的。由于这个类使用HttpServletRequest#isUserInRole(...)来检查角色,因此一种方法是在相应的AuthenticationProviderLdapAuthoritiesPopulator中使用RoleHierarchyAuthoritiesMapper

@Bean
@Conditional(DummyUserCondition.class)
public DaoAuthenticationProvider dummyUserAuthenticationProvider(
        InMemoryUserDetailsManager dummyUserDetailsService, RoleHierarchy roleHierarchy) {
    var provider = new DaoAuthenticationProvider();
    provider.setUserDetailsService(dummyUserDetailsService);
    provider.setAuthoritiesMapper(new RoleHierarchyAuthoritiesMapper(roleHierarchy));
    return provider;
}

见https://github.com/vaadin/flow/issues/16621#issuecomment-1514625986

相关问题