Окружающая среда: У меня есть приложение для архитектуры микросервиса с загрузкой spring, состоящее из нескольких инфраструктурных служб и ресурсов (содержащих бизнес-логику). Авторизация и аутентификация обрабатываются службой oAuth2-Service, управляющей пользовательскими объектами, и созданием токенов JWT для клиентов.
Чтобы протестировать одно приложение микросервиса в целом, я попытался построить тесты с помощью testNG, spring.boot.test, org.springframework.security.test...
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, properties = {"spring.cloud.discovery.enabled=false", "spring.cloud.config.enabled=false", "spring.profiles.active=test"})
@AutoConfigureMockMvc
@Test
public class ArtistControllerTest extends AbstractTestNGSpringContextTests {
@Autowired
private MockMvc mvc;
@BeforeClass
@Transactional
public void setUp() {
// nothing to do
}
@AfterClass
@Transactional
public void tearDown() {
// nothing to do here
}
@Test
@WithMockUser(authorities = {"READ", "WRITE"})
public void getAllTest() throws Exception {
// EXPECT HTTP STATUS 200
// BUT GET 401
this.mvc.perform(get("/")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
}
}
где конфигурация безопасности (ресурсного сервера) следующая
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
// get the configured token store
@Autowired
TokenStore tokenStore;
// get the configured token converter
@Autowired
JwtAccessTokenConverter tokenConverter;
/**
* !!! configuration of springs http security !!!
*/
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/**").authenticated();
}
/**
* configuration of springs resource server security
*/
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
// set the configured tokenStore to this resourceServer
resources.resourceId("artist").tokenStore(tokenStore);
}
}
и следующая проверка безопасности на основе метода, аннотированная внутри класса контроллера
@PreAuthorize("hasAuthority('READ')")
@RequestMapping(value = "/", method = RequestMethod.GET)
public List<Foo> getAll(Principal user) {
List<Foo> foos = fooRepository.findAll();
return foos;
}
Я думал, что это сработает, но при запуске теста я получаю ошибку утверждения
java.lang.AssertionError: Status
Expected :200
Actual :401
Вопрос:
Есть ли что-то совершенно очевидное, что я делаю неправильно? Или @WithMockUser не собирается работать с @SpringBootTest и @AutoConfigureMockMvc в среде oAuth2? Если это так... что было бы лучшим подходом для тестирования конфигураций безопасности на основе маршрутов и методов как часть такого (интеграционного) теста, подобного этому?
Приложение:
Я также пробовал разные подходы вроде чего-то вроде следующего... но это привело к такому же результату: (
this.mvc.perform(get("/")
.with(user("admin").roles("READ","WRITE").authorities(() -> "READ", () -> "WRITE"))
.accept(MediaType.APPLICATION_JSON))
см:
spring тестирование безопасности
spring загрузка 1.4 для тестирования