среды: У меня есть на основе пружинных загрузок приложения microservice архитектуры, состоящее из нескольких инфраструктурных услуг и услуг ресурсов (содержащей бизнес-логику). Авторизация и аутентификация обрабатываются службой oAuth2-Service, управляющей пользовательскими объектами, и созданием токенов JWT для клиентов.Использование @WithMockUser (с @SpringBootTest) внутри oauth2 ресурсов сервера приложения
Для проверки одного приложения microservice в целом я пытался построить тесты с 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);
}
}
и следующий метод основан на проверке безопасности аннотированных ins Ide класса контроллера
@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 security testing
spring boot 1.4 testing
Добавление этого класса в мой проект maven/java работает для меня с Spring Boot 1.5.4 и 1.5.9. Теперь я могу использовать user @WithMockUser, как я ожидал. – DaShaun
Добавление этого класса в мой проект позволяет обойти систему безопасности, но это не похоже на вопрос пользователя. Он всегда передает безопасность независимо от того, какую область я предоставляю своим тестовым пользователям. Это намерение? – Rig