2017-04-18 90 views
0

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

org.springframework.beans.BeanInstantiationException:无法 实例化[org.springframework.web.servlet.HandlerMapping]:出厂 法 'defaultServletHandlerMapping' 抛出异常;嵌套0​​例外是java.lang.IllegalArgumentException异常:一个ServletContext是配置默认的servlet处理

我尝试了很多不同的配置方案的要求 ,没有工作...... 这里是我的基本的Web安全配置类(我加角色层次相关的豆类如你所见):

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

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

每一个帮助感激!

回答

0

好的,找到它了。

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

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

这:

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

最有趣的部分是,从here接受的答案建议什么也没有为我工作。