[JAVA] Une erreur 404 se produit lors du test de l'authentification par formulaire avec Spring Security

Aperçu

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

solution de contournement

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"));
    }
}

À propos des paramètres de formulaire

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 ().

Appliquer SpringSecurity

Si springSecurity () n'est pas appliqué, ce sera 404 même si csrf () est défini dans MockMvcRequestBuilders # post.

Recommended Posts

Une erreur 404 se produit lors du test de l'authentification par formulaire avec Spring Security
J'obtiens une erreur lors de l'ajout d'une dépendance
Une note sur "Ne pas émettre une erreur de certificat avec un certificat auto-signé à l'aide de Keytool Java"
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Implémentez la fonction d'authentification avec Spring Security ③
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Certification / autorisation avec Spring Security & Thymeleaf
J'obtiens une erreur de version de Ruby lorsque j'essaye de démarrer Rails.
Authentification DB avec Spring Security et hachage avec BCrypt
Obtenez une authentification BASIC avec Spring Boot + Spring Security
[Visual Studio Code] J'obtiens une erreur de syntaxe lors de l'exécution du débogage lors de l'utilisation de rbenv
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
Ajoutez vos propres éléments d'authentification avec Spring Security
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Après avoir renouvelé le certificat avec CircleCI × fastlane, j'obtiens un état de sortie: erreur 65.
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Un mémorandum lors de l'essai de Spring Data JPA avec STS
À propos de l'authentification Spring Security
Notez que j'étais accro au traitement par lots avec Spring Boot
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
J'ai essayé de démarrer avec Spring Data JPA
Un mémorandum lors de la création d'un service REST avec Spring Boot
Quand je bcrypt avec node + docker, j'ai une erreur
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
Lors du téléchargement d'un fichier avec Spring Boot, la gestion des erreurs est effectuée lorsque la taille maximale du fichier est dépassée.
J'ai une question. Une erreur se produit lors de la lecture d'une vidéo dans Listview avec Android.
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
Un nouvel employé a tenté de créer une fonction d'authentification / autorisation à partir de zéro avec Spring Security
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
Démarrez avec Spring Boot
Fonction de connexion avec Spring Security
Erreur lors de la lecture avec java
Erreur lors de l'introduction de l'authentification SNS
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 1/3 (paramètres Jasper Reports)
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 3/3 (contrôle Spring MVC)
Quand je pousse vers Heroku, je suis en colère contre l'échec de la précompilation des actifs.
J'ai essayé d'implémenter un client OAuth avec Spring Boot / Security (connexion LINE)
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails
Authentification / autorisation de mémo d'utilisation de Spring Security
Utiliser l'authentification de base avec Spring Boot
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
J'ai créé une interface graphique avec Swing
Obtenez des résultats de validation avec Spring Boot
Découvrez l'architecture de traitement de l'authentification Spring Security
Authentification Oauth2 avec Spring Cloud Gateway
J'ai essayé GraphQL avec Spring Boot
J'ai essayé Flyway avec Spring Boot
À propos des erreurs lors de la mise en œuvre de la validation du printemps
J'obtiens une erreur avec l'installation du bundle et puma ne peut pas être installé.
Spring Boot + MyBatis J'obtiens cette erreur si je ne configure pas la base de données
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 2/3 (création de modèle de formulaire)
[LINE BOT] J'ai créé un Ramen BOT avec Java (Maven) + Heroku + Spring Boot (1)
Lors de l'enregistrement d'un nouvel utilisateur, j'ai eu une erreur appelée ActiveRecord :: NotNullViolation et comment y faire face.
Lors de l'introduction de JOOQ dans Spring Boot, une histoire qui a été traitée parce qu'une erreur s'est produite autour de Liquidbase