Spring security Spring安全测试:测试注释@Secured(或@PreAuthorize)
我有一个问题(当然:)。我有一个带有spring安全性和spring MVC(带有RESTAPI)的spring 4.2应用程序,我想测试Rest方法上存在的@Secured(ROLE_FOO)注释的有效性。 所以我需要为此安装spring安全测试库。好啊 然后我跟进一些教程(或文档),如官方教程: 这里是我的测试代码(我正在尝试删除所有“不必要的”代码) 下面是我要测试的方法: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
@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 {
}