Тест интеграции Spring Security для стратегии аутентификации сеанса - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть веб-приложение Spring MVC + Spring Security.Приложение имеет собственную стратегию аутентификации сеанса, настроенную в конфигурации

http.sessionManagement()
                .sessionAuthenticationStrategy( ... )

Поскольку стратегия содержит сложную логику, важно проверить ее поведение с помощью интеграционных тестов.

Когда мы используем spring-security-test @WithMockUser метод контроллера вызывается в тестах, однако наша стратегия аутентификации не называется .

Какой правильный способ обеспечить полный процесс аутентификации в тестах Spring Security, чтобы гарантировать, чтоСтратегия аутентификации сеанса действительно называется?

Или перефразировать: как вызвать всю цепочку фильтров безопасности Spring?

Спасибо за идеи.

1 Ответ

0 голосов
/ 07 декабря 2018

В вашем интеграционном тесте укажите static WebSecurityConfigurerAdapter, и он должен быть выбран.

Например:

@EnableWebSecurity
static class CustomSessionAuthenticationStrategyConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .sessionManagement()
                .sessionAuthenticationStrategy(customSessionAuthenticationStrategy);
    }
}

ОБНОВЛЕНИЕ:

Вот тест MockMvc в Spring Security 4.x.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class SessionAuthenticationStrategyTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void setup() {
        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

    @Test
    public void requestWhenCustomSessionAuthenticationStrategyProvidedThenCalled() throws Exception {
        this.mvc.perform(formLogin().user("user").password("password"));
        verify(CustomSessionAuthenticationStrategyConfig.customSessionAuthenticationStrategy)
                .onAuthentication(any(Authentication.class), any(HttpServletRequest.class), any(HttpServletResponse.class));
    }

    @EnableWebSecurity
    static class CustomSessionAuthenticationStrategyConfig extends WebSecurityConfigurerAdapter {
        static SessionAuthenticationStrategy customSessionAuthenticationStrategy = mock(SessionAuthenticationStrategy.class);

        @Override
        public void configure(HttpSecurity http) throws Exception {
            http
                .formLogin()
                    .and()
                .sessionManagement()
                    .sessionAuthenticationStrategy(customSessionAuthenticationStrategy);
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .inMemoryAuthentication()
                    .withUser("user").password("password").authorities("ROLE_USER");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...