Есть ли способ повысить только контекст безопасности в тестах Spring Boot? - PullRequest
0 голосов
/ 07 мая 2018

Я хочу написать какой-нибудь модульный тест, который зависит от Spring Security.

Например, у меня есть какой-то сервисный метод, который использует некоторый репозиторий и помечен аннотацией @PreAuthorize. Репозиторий Я могу издеваться над Mockito, нет проблем. Также я могу смоделировать контекст безопасности с помощью аннотации @ WithSecurityContext . Но когда я запускаю тест, аннотация @PreAuthorize просто игнорируется. Конечно, я могу запустить этот тест с аннотацией @SpringBootTest в качестве интеграционного теста, и в этом случае контекст безопасности работает, но этот путь тяжелый и медленный.

Есть ли способ запустить модульное тестирование только с Повышен контекст безопасности Spring?

UPDATE

Сделал пример такого рода теста. Спасибо @Sam Brannen за правильное направление.

@ActiveProfiles("method-security-test")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ExampleService.class, ExampleServiceTest.MethodSecurityConfiguration.class})
public class ExampleServiceTest {

    private ExampleService service;

    @Autowired
    public void setService(ExampleService service) {
        this.service = service;
    }

    @Test
    @WithMockUser(username = "john_doe")
    public void testAuthenticated() {
        String actualMessage = service.example();
        Assert.assertEquals("Message of john_doe", actualMessage);
    }

    @Test(expected = AuthenticationException.class)
    public void testNotAuthenticated() {
        service.example();
        Assert.fail();
    }

    @TestConfiguration
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    static class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
    }
}

@Service
class ExampleService {
    @PreAuthorize("isAuthenticated()")
    String example() {
        Principal principal = SecurityContextHolder.getContext().getAuthentication();
        return "Message of " + principal.getName();
    }

1 Ответ

0 голосов
/ 08 мая 2018

Примечание @PreAuthorize от Spring Security будет учитываться только в том случае, если Spring Security проксирует ваш компонент (например, служебный компонент).

Самый простой способ сделать это - пометить класс @Configuration с помощью @EnableGlobalMethodSecurity(prePostEnabled = true), зарегистрировать компонент в качестве компонента (например, с помощью сканирования компонентов или метода @Bean) и включить ваш AuthenticationManager установка.

Затем вы можете создать целенаправленный интеграционный тест, используя @ContextConfiguration (без поддержки тестирования Spring Boot) для загрузки ApplicationContext из вашего @Configuration класса. И вы можете использовать @Autowired, чтобы получить доступ к прокси-компоненту, который будет рекомендован при поддержке проверки безопасности @PreAuthorize.

Возможно, этот старый пост в блоге окажется полезным для справочной информации: https://spring.io/blog/2013/07/04/spring-security-java-config-preview-method-security/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...