我添加了 基于方法的安全性 并添加了 角色层次结构 。在构建过程中,我不断收到以下异常:
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; } }
我为此奋斗了许多小时。我尝试过的相关主题在这里:
每一个帮助表示赞赏!
好,找到了。
我研究了类注释,并得出了一个简单的解决方案:我@EnableGlobalMethodSecurity从GlobalMethodSecurityConfig中删除了它,并将其移到了以前的WebSecurityConfiguration中。所以看起来像这样:
@EnableGlobalMethodSecurity
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { (...) }
和这个:
@Configuration public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration { (...) }
最有趣的部分是,从这里接受的答案可以告诉我哪些对我不起作用。