Une erreur 404 s'est produite lors du test de l'authentification par formulaire avec la configuration suivante dans Spring Security.
POST ---------------------------------> Écran de formulaire AuthenticationProvider ·Nom d'utilisateur ・ Mot de passe <================================== Informations de l'utilisateur
SecurityConfig.java
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/webjars/**", "/css/");
}
@Override
protected void configure(HttpSecurity http) {
http.authorizeRequests()
.antMatchers("signin").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginProcessingUrl("/authentication")
.loginPage("signin")
.failureUrl("signin" + "?error")
.successForwardUrl("/hoge/list")
.failureForwardUrl("/authenticationError")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutSuccessUrl("signin");
}
TestClass.java
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = HogeApplication.class)
public class TestClass {
@Before
public void Préparer la demande() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}
@Test
public void S'authentifier avec l'URL de la demande() throws Exception {
ResultActions result = mvc.perform(
MockMvcRequestBuilders.post("/authentication")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("username",Compte d'utilisateur)
.param("password",mot de passe)
);
result.andExpect(status().isOk())
.andExpect(forwardedUrl("/hoge/list"));
}
}
Résultats d'assertion java.lang.AssertionError: Status Expected :200 Actual :404
Prenez les deux solutions de contournement suivantes.
En appliquant ce qui précède, la classe de test sera la suivante.
TestClass.java
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = HogeApplication.class)
public class TestClass {
@Before
public void Préparer la demande() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity()) //Si cela n'est pas appliqué, même si csrf est défini, ce sera 404.
.build();
}
@Test
public void S'authentifier avec l'URL de la demande() throws Exception {
ResultActions result = mvc.perform(
MockMvcRequestBuilders.post("/authentication")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.with(csrf())
.param("username",Compte d'utilisateur)
.param("password",mot de passe)
);
result.andExpect(status().isOk())
.apply(springSecurity()) //Si cela n'est pas appliqué, même si csrf est défini, ce sera 404.
.andExpect(forwardedUrl("/hoge/list"));
}
}
Documentation officielle mentionne également csrf (), mais publie explicitement Le nom d'utilisateur et le mot de passe n'ont pas été transmis au côté serveur dans l'implémentation suivante sans demande. Il y a peut-être un problème, mais je ne sais pas. .. ..
TestClass.java
public class TestClass {
Méthodes qui ne passent pas le paramètre public() {
ResultActions result2 = mvc.perform(formLogin("/authentication")
.user(Compte d'utilisateur).password(mot de passe));
result2.andExpect(status().isOk())
.andExpect(forwardedUrl("/clients/list"))
.andDo(MockMvcResultHandlers.print());
ResultActions result3 = mvc.perform(MockMvcRequestBuilders.post("/authentication")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.with(csrf())
.with(user(Compte d'utilisateur).password(mot de passe)));
result3.andExpect(status().isOk())
.andExpect(forwardedUrl("/clients/list"))
.andDo(MockMvcResultHandlers.print());
}
}
Le résultat était le même avec csrf (). AsHeader ().
Si springSecurity () n'est pas appliqué, ce sera 404 même si csrf () est défini dans MockMvcRequestBuilders # post.
Recommended Posts