Тестирование Spring Boot 2 с помощью Spring Security
У меня возникли некоторые проблемы при тестировании приложения Spgring Boot 2 с использованием Spring Security 5.1.
Проблема: я всегда получаю 403 на ответ.
Вот два подхода, которые я попробовал:
1) Отключите безопасность для тестирования, выполнив:
@Value("${security.enabled:true}")
private boolean securityEnabled;
@Override
protected void configure(HttpSecurity pHttpSecurity) throws Exception
{
if (!securityEnabled)
{
return;
}
И использование application.properties только для тестирования с этой переменной, установленной в false. Это все еще приводит к 403, так как PreAuthorize все еще хочет, чтобы вы были авторизованы, и я наблюдал такое же поведение при отключении конфигурации безопасности в прошлом: я должен был также закомментировать все аннотации PreAuthorize для ручного тестирования без секретности.
2) Запуск теста с:
@WithMockUser(username = "admin", roles = "ADMIN")
Это решение на самом деле создает проблему, заключающуюся в том, что PreAuthorize не добавляет автоматически префикс ROLE_, и именно поэтому я использовал его, поскольку в моих ролях его тоже не было. Для того, чтобы попытаться выполнить тестовый прогон, я на самом деле изменил это для маршрутов, к которым у меня есть доступ, и, если это единственный способ работы, я изменю имена ролей (но тогда, возможно, @Secured сделает то же самое).
Так выглядит соответствующая часть запроса при использовании @WithMockUser.
MockHttpServletRequest:
HTTP Method = POST
Request URI = /admin/createUser
Parameters = {}
Headers = {Content-Type=[application/json]}
Body = <no character encoding set>
Session Attrs = {SPRING_SECURITY_CONTEXT=org.springframework.security.core.context.SecurityContextImpl@e0791834:
Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@e0791834:
Principal: org.springframework.security.core.userdetails.User@586034f:
Username: admin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true;
credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN;
Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_ADMIN}
Я также пробовал @Secured и @RolesAllowed с добавлением и без добавления ROLE_ и таким же поведением. Ни один из ответов, предложенных в других подобных постах, до сих пор не работал.
Итак, какая-нибудь помощь в том, что я делаю не так? Любой способ правильного тестирования с включенной безопасностью? Если нет, то есть ли способ заставить Spring игнорировать PreAuthorize, если безопасность отключена?
Заранее спасибо!
1 ответ
Для будущих посетителей, и большое спасибо этому парню, которого я нашел в связанных постах этого (но не поискал его раньше>.<) С точно такой же проблемой:
В основном я должен был добавить.with(csrf())
mvc.perform(post("/admin/createUser").with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(jsonNode.toString()))
.andExpect(status().isOk());