Тестирование 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());
Другие вопросы по тегам