Тест интеграции 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");
}
}
}