Spring security Spring安全测试:测试注释@Secured(或@PreAuthorize)

Spring security Spring安全测试:测试注释@Secured(或@PreAuthorize),spring-security,spring-test-mvc,Spring Security,Spring Test Mvc,我有一个问题(当然:)。我有一个带有spring安全性和spring MVC(带有RESTAPI)的spring 4.2应用程序,我想测试Rest方法上存在的@Secured(ROLE_FOO)注释的有效性。 所以我需要为此安装spring安全测试库。好啊 然后我跟进一些教程(或文档),如官方教程: 这里是我的测试代码(我正在尝试删除所有“不必要的”代码) 下面是我要测试的方法: @RestController @RequestMapping("/api") public class UserR

我有一个问题(当然:)。我有一个带有spring安全性和spring MVC(带有RESTAPI)的spring 4.2应用程序,我想测试Rest方法上存在的@Secured(ROLE_FOO)注释的有效性。 所以我需要为此安装spring安全测试库。好啊 然后我跟进一些教程(或文档),如官方教程:

这里是我的测试代码(我正在尝试删除所有“不必要的”代码)

下面是我要测试的方法:

@RestController
@RequestMapping("/api")
public class UserResource {

    @RequestMapping(value = "/users/liste", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @Timed
    @Transactional(readOnly = true)
    @Secured({ AuthoritiesConstants.TC_ADMIN })
    public ResponseEntity<List<ManagedUserDTO>> getUserListe(Pageable pageable, Principal principal) throws URISyntaxException {

        //doSomething...
    }
返回null?? @WithMockUser应自动对用户进行身份验证(因此为主体)

谢谢

EDIT1:测试的设置部分(仅涉及安全说明):

EDIT2:只是为了明确类定义:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@TestExecutionListeners(listeners={ServletTestExecutionListener.class,
        DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        WithSecurityContextTestExecutionListener.class})
public class UserResourceIntTest {
}

问题是Spring Security的
with Security ContextTestExecutionListener
没有被执行,因为
@IntegrationTest
被禁用

很可能您不需要使用
MockMvc
进行
@IntegrationTest
,因此您应该能够完全删除它并解决您的问题

或者,您可以通过向类中显式添加
with securityContextTestExecutionListener
来解决此问题,如:

@TestExecutionListeners(监听器={with securityContextTestExecutionListener.class,IntegrationTestPropertiesListener.class,
DirtiesContextBeforeMestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,SqlScriptsTestExecutionListener.class})
@集成测试
公共类UserResourceIntTest{

您使用的是哪个版本的spring测试?请参阅“spring Security的测试支持需要spring-test-4.1.3.RELEASE或更高版本。”pom.xml中未指定版本。关于spring,唯一指定的版本位于pom.xml的顶部:spring boot starter父级org.springframework.boot 1.3.1.RELEASE抱歉,在我的maven依赖项(jars文件)中,我使用的是spring-test-4.2.4.RELEASE。我现在是移动的,但您的注释似乎被默认的TestExecutionListeners覆盖。请尝试删除
@IntegrationTest
,因为这在MockMvc中是不必要的,可能是问题。谢谢,但仍然不起作用。事实上,我没有错误,但设置了一个虚拟role并不意味着http 401错误。测试始终通过。我的设置配置:cf.EDIT1获取测试设置代码。
SecurityContextHolder.getContext().getAuthentication()
@Inject
private FilterChainProxy springSecurityFilterChain;

@Inject
private PageableHandlerMethodArgumentResolver pageableArgumentResolver;

@Before
public void setup() {

....

this.restUserMockMvc2 = MockMvcBuilders
                .standaloneSetup(userResource2)
                .alwaysDo(print())              .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
                .setCustomArgumentResolvers(pageableArgumentResolver)
                .build();

...

}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@TestExecutionListeners(listeners={ServletTestExecutionListener.class,
        DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        WithSecurityContextTestExecutionListener.class})
public class UserResourceIntTest {
}