2016-03-30 3 views
1

У меня проблема (конечно :)). У меня есть приложение весны 4.2 с Spring Security и Spring MVC (с API-интерфейсом Rest API), и я хочу проверить эффективность аннотации @Secured (ROLE_FOO), присутствующей в методе REST. Для этого мне нужно установить тестовую библиотеку Spring-Security. ОК. Тогда я следую за некоторые учебники (или DOC) как официальной: http://docs.spring.io/autorepo/docs/spring-security/4.1.0.RC1/reference/htmlsingle/Тест безопасности на весну: проверка аннотации @ Необработанные (или @PreAuthorize)

Вот мой тестовый код (I'am пытается удалить все «uneccessary» код

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebAppConfiguration 
@IntegrationTest 
public class UserResourceIntTest { 

    private MockMvc restUserMockMvc2; 

    @Autowired 
    private WebApplicationContext context; 

....//Injection, Mocks declarations here 

@Before 
    public void setup() { 




     this.restUserMockMvc2 = MockMvcBuilders.webAppContextSetup(context).apply(SecurityMockMvcConfigurers.springSecurity()).build(); 



    } 


    @Test 
    @WithMockUser(roles="ROLE_VIEWER") 
    public void testGetUserListe() throws Exception { 
     //here getAuthentication() returns null !!! why ??? 
     SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
//  restUserMockMvc2.perform(get("/api/users/liste") 
//    .principal(SecurityContextHolder.getContext().getAuthentication())) 
//    .accept(MediaType.APPLICATION_JSON)) 
//    .andExpect(status().isForbidden()); 
//    .andExpect(content().contentType("application/json")); 
    } 

Вот метод, который я хочу. для теста:

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

    @RequestMapping(value = "https://stackoverflow.com/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... 
    } 

Можете ли вы сказать мне, почему в моем тесте,

SecurityContextHolder.getContext().getAuthentication() 

возвращает null ?? @WithMockUser должен проверить подлинность пользователя автоматически (принципала), следовательно,

Благодарности

EDIT1: установка часть теста (относительно только инструкции безопасности):

@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(); 

... 

} 

EDIT2: просто быть ясно, по определению класса:

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

Какая версия весна-теста вы используете? Из справки «Поддержка тестирования Spring Security требует весеннего теста-4.1.3.RELEASE или выше». –

+0

Нет версии, указанной в pom.xml. Что касается весны, только указанная версия находится в верхней части pom.xml: весна-загрузки-стартер-родитель org.springframework.boot 1.3.1.RELEASE

+0

Извините, в моих зависимостях maven (файлы jars) у меня есть spring-test-4.2.4.RELEASE. –

ответ

1

проблема в том, что Spring Security-х WithSecurityContextTestExecutionListener не выполняется Ве причина @IntegrationTest есть overriding the default TestExecutionListeners.

Скорее всего, вам не нужен @IntegrationTest с MockMvc, поэтому вы должны быть в состоянии полностью удалить его и решить проблему.

В качестве альтернативы вы можете решить эту проблему путем явного добавления WithSecurityContextTestExecutionListener к классу, как:

@TestExecutionListeners(listeners = { WithSecurityContextTestExecutionListener.class, IntegrationTestPropertiesListener.class, 
     DirtiesContextBeforeModesTestExecutionListener.class, 
     DependencyInjectionTestExecutionListener.class, 
     DirtiesContextTestExecutionListener.class, 
     TransactionalTestExecutionListener.class, SqlScriptsTestExecutionListener.class }) 
@IntegrationTest 
public class UserResourceIntTest { 
+0

Спасибо, но все равно не работаем. На самом деле, у меня нет ошибок, но установка фиктивной роли не подразумевает ошибку http 401. Тест всегда проходит. Моя настройка: cf. EDIT1 для тестового установочного кода. –

 Смежные вопросы

  • Нет связанных вопросов^_^