Spring security Spring security DefaultMethodSecurityExpressionHandler bean未注册用于集成测试';默认的spring安全配置

Spring security Spring security DefaultMethodSecurityExpressionHandler bean未注册用于集成测试';默认的spring安全配置,spring-security,thymeleaf,spring-test,spring-test-mvc,spring-mvc-test,Spring Security,Thymeleaf,Spring Test,Spring Test Mvc,Spring Mvc Test,我正在尝试为视图层编写带有Spring安全性和Thymeleaf的Spring MVC集成测试 我已经使用Spring Security Integration设置了MockMvc对象,就像文档中的所有示例一样 集成测试设置: import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*; import static org.springframework.securi

我正在尝试为视图层编写带有Spring安全性和Thymeleaf的Spring MVC集成测试

我已经使用Spring Security Integration设置了MockMvc对象,就像文档中的所有示例一样

集成测试设置:

import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.*;
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

    @Autowired 
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void setup() {

        mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                //.defaultRequest(get("/").with(user(someUser)))
                .apply(springSecurity())
                .build();
    }
Thymeleaf配置为使用SpringSecurityDialogue。(thymeleaf-extras-springsecurity4)

为了能够在视图层中使用spring安全表达式(示例)


如果您正在使用
@ContextHierarchy
为测试加载
WebApplicationContext
,那么这将不适用于Spring Framework 4.1.4到4.1.6,因为4.1.7中会修复一个已确认的错误

有关详细信息,请参阅。

降级到Spring v4.1.3“修复”了此问题。。。这让我怀疑这是一个bug。
 additionalDialects.add( new SpringSecurityDialect());
<p sec:authorize="hasRole('ROLE_USER')"> User logged in</p>
@SuppressWarnings("unchecked")
private static SecurityExpressionHandler<FilterInvocation> getExpressionHandler(final ServletContext servletContext) {

    final ApplicationContext ctx =
            WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);

    final Map<String, SecurityExpressionHandler> expressionHandlers =
            ctx.getBeansOfType(SecurityExpressionHandler.class);

    for (SecurityExpressionHandler handler : expressionHandlers.values()) {
        if (FilterInvocation.class.equals(GenericTypeResolver.resolveTypeArgument(handler.getClass(), SecurityExpressionHandler.class))) {
            return handler;
        }
    }

    throw new TemplateProcessingException(
            "No visible SecurityExpressionHandler instance could be found in the application " +
            "context. There must be at least one in order to support expressions in Spring Security " +
            "authorization queries.");
Spring v4.1.6
Spring Security 4.0.1
Thymeleaf v2.1.4