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 или как издеваться над аутентификацией.
Ответы
Ответ 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 во время установки теста. См. Поддержка классов для тестирования интеграции