小编典典

基于SpringBoot +方法的分层角色安全性:ServletContext是必需的

spring-boot

我添加了 基于方法的安全性 并添加了 角色层次结构 。在构建过程中,我不断收到以下异常:

org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.web.servlet.HandlerMapping]:工厂方法’defaultServletHandlerMapping’抛出异常;嵌套的异常是java.lang.IllegalArgumentException:
需要ServletContext来配置默认的Servlet处理

我尝试了许多不同的配置替代方法,但均无济于事…这是我的基本Web安全配置类(如您所见,我添加了与角色层次结构相关的bean):

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

(...)

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
            .csrf()
            .disable()
            (...)
            .expressionHandler(webExpressionHandler())
            (...)
            .anyRequest().authenticated();

    httpSecurity
            .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
}

@Bean
public SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
    DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
    defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
    return defaultWebSecurityExpressionHandler;
}

@Bean
public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl r = new RoleHierarchyImpl();
    r.setHierarchy(Role.getHierarchy());
    return r;
}

(...)

}

这是我基于此线程创建的单独的配置文件:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Autowired
    private RoleHierarchy roleHierarchy;

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler = (DefaultMethodSecurityExpressionHandler) super.createExpressionHandler();
        expressionHandler.setRoleHierarchy(roleHierarchy);
        return expressionHandler;
    }
}

我为此奋斗了许多小时。我尝试过的相关主题在这里:

每一个帮助表示赞赏!


阅读 486

收藏
2020-05-30

共1个答案

小编典典

好,找到了。

我研究了类注释,并得出了一个简单的解决方案:我@EnableGlobalMethodSecurity从GlobalMethodSecurityConfig中删除了它,并将其移到了以前的WebSecurityConfiguration中。所以看起来像这样:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { (...) }

和这个:

@Configuration
public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration { (...) }

最有趣的部分是,从这里接受的答案可以告诉我哪些对我不起作用。

2020-05-30