издевательская аутентификация весна безопасности - PullRequest
14 голосов
/ 20 января 2012

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

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

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

Ответы [ 2 ]

15 голосов
/ 20 января 2012

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

  • Если вы хотите протестировать бизнес-логику своего приложения без каких-либо мер безопасности, вы можете полностью отключить безопасность.Предполагая, что вы используете 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();
    }
    
  • Наконец, если вы хотите проверить аутентификацию, вы можете запустить тестс базой данных, содержащей данные испытаний.

5 голосов
/ 20 января 2012

а) Это не модульный тест, это интеграционный тест.Модульный тест не будет проблемой.

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

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

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