web-dev-qa-db-fra.com

Désactiver la classe de configuration Spring Security pour @WebMvcTest dans Spring Boot

Récemment, j'ai ajouté Spring Security à mon projet Spring Boot en utilisant la classe suivante:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MySecurityConfig {
}

par conséquent, par défaut, toutes mes URL sont désormais protégées par une authentification et un mot de passe auto-généré.

Le problème est que tous les tests dans une classe @WebMvcTest que j'ai utilisé pour tester un contrôleur unitaire:

@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTest {...}

échouent désormais partout faute d’autorisation.

Question: puis-je dire aux méthodes @Test d'ignorer l'autorisation pour qu'elles continuent à réussir comme avant?

Comment puis-je empêcher la classe de configuration @ EnableWebSecurity d'être sélectionnée dans une classe de test unitaire @ WebMvcTest spécifique?

Je voudrais que les tests déjà en place puissent continuer et tester les fonctionnalités d'authentification séparément plus tard.

Jusqu'à présent, j'ai essayé d'utiliser une classe de configuration imbriquée dans la classe testing afin d'exclure les configurations de sécurité:

@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTest {

    @Configuration
    @EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class})
    static class ContextConfiguration { }

 ....}

mais cela ne semble pas fonctionner.

NOTE : j'utilise Spring Boot 1.5.8

10
Johan

Vous pouvez définir secure = false dans l'annotation @WebMvcTest. Il sautera la configuration automatique MockMvc de sécurité du printemps dans votre test

@WebMvcTest(controllers = SomeController.class, secure = false)
public class SomeControllerTest {
20
Mzzl

Avec Spring Security 4+, je trouve @WithMockUser l'annotation est très pratique. Il fournit un faux utilisateur et un mot de passe pour tester les méthodes de sécurité du printemps annotées avec @PreAuthorize ou @PostAuthorize. Il vous suffit d'annoter la méthode de test avec @WithMockUser. Le rôle par défaut de l'utilisateur est USER. Vous pouvez également remplacer le nom d'utilisateur et le rôle par défaut.

//default
@Test
@WithMockUser
public void getProfile() {
   //your test here
} 

//with username and roles
@Test
@WithMockUser(username = "john", roles={"ADMIN"})
public void getProfile() {
   //your test here
} 

REMARQUE: cette annotation peut être utilisée pour les classes.

@WithMockUser(username = "john", roles={"ADMIN"})
public class UsersAdminSecurityTest {
} 
5
alltej