Подтвердить что ты не робот

Mocking authentication spring безопасность

У меня есть метод репозитория, аннотированный с помощью @Secured. Я пытаюсь написать unit test для этого метода, но мой тест завершился неудачно, потому что для вызова метода мне нужна аутентификация. Самым методом является метод save(). Ошибка, возникающая при вызове метода:

 org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

Я не могу проверить этот метод, потому что он требует аутентификации, и я не могу сохранить пользователя для аутентификации (я использую hsqldb), потому что мне нужно будет вызвать этот метод для сохранения. Любые советы о том, как unit test метод аннотируется с помощью @secured или как издеваться над аутентификацией.

4b9b3361

Ответ 1

Это зависит от того, что вы хотите проверить.

  • Если вы хотите протестировать бизнес-логику своего приложения без каких-либо средств безопасности, вы можете полностью отключить безопасность. Предполагая, что вы используете SpringJunit4Runner, вы можете включить конфигурацию безопасности в отдельный файл и не включать ее в @ContextConfiguration.

  • Если вы хотите протестировать авторизацию (например, правильную работу аннотаций @Secured), вы можете напрямую обратиться к SecurityContext, минуя все связанные с аутентификацией вещи (в этом случае вы можете поместить конфигурацию проверки подлинности в отдельный файл и не загружайте его также):

    Все, что вам нужно, - поместить соответствующий Authentication объект в SecurityContextHolder:

    @Test
    public void myTest() {
        login(...);
        ...
        logout();
    }
    
    private void login(...) {
        SecurityContextHolder.getContext().setAuthentication(
            new UsernamePasswordAuthenticationToken(...)
        )
    }
    
    private void logout() {
        SecurityContextHolder.clearContext();
    }
    
  • Наконец, если вы хотите протестировать аутентификацию, вы можете запустить тест с базой данных, содержащей тестовые данные.

Ответ 2

a) Это не unit test, это тест интеграции. A unit test не будет проблемой.

b) Я попытался бы разделить ваши тестовые настройки. Почему бы не просто отключить безопасность spring в тестах, где вы не тестируете связанные с безопасностью функции?

c) Если все остальное не удается: введите объект JdbcTemplate и создайте данные пользователя вручную в SQL во время установки теста. См. Поддержка классов для тестирования интеграции