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