Тест интеграции Spring Security для стратегии аутентификации сеанса

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

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

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

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

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

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

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

1 ответ

Решение

В своем интеграционном тесте укажите 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");
        }
    }
}
Другие вопросы по тегам