2017-04-18 81 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接受的答案建議什麼也沒有爲我工作。