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

时间:2017-04-18 09:21:10

标签: spring spring-mvc spring-boot spring-security

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

  

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;
}

(...)

}

以下是我根据this thread创建的单独配置文件:

@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;
    }
}

我挣扎了好几个小时。我试过的相关主题在这里:

感谢每一位帮助!

1 个答案:

答案 0 :(得分:0)

好的,找到了。

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

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

和此:

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

最有趣的部分是here接受的答案提出了对我不起作用的建议。