Les tests de Printemps de la Sécurité d'Amorçage simplement
J'ai du mal avec les tests de contrôle d'accès sur les Url protégé par un Ressort de Sécurité.
La configuration ressemble à ceci:
http
.authorizeRequests()
.antMatchers("/api/user/**", "/user").authenticated()
.antMatchers("/api/admin/**", "/templates/admin/**", "/admin/**").hasAuthority("ADMIN")
.anyRequest().permitAll();
Et la classe de test ressemble à ceci:
package com.kubukoz.myapp;
import com.kubukoz.myapp.config.WebSecurityConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.security.web.FilterChainProxy;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import javax.transaction.Transactional;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {MyApplication.class, WebSecurityConfig.class})
@WebAppConfiguration
@TransactionConfiguration(defaultRollback = true)
@Transactional(rollbackOn = Exception.class)
public class MyApplicationTests {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Autowired
private FilterChainProxy filterChainProxy;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.dispatchOptions(true)
.addFilters(filterChainProxy)
.build();
}
@Test
public void testAnonymous() throws Exception {
mockMvc.perform(get("/api/user/account")).andExpect(status().is3xxRedirection());
}
@Test
public void testUserAccessForAccount() throws Exception{
mockMvc.perform(get("/api/user/account")).andExpect(status().isOk());
}
}
Quel est le moyen le plus facile pour faire les deux derniers tests pass?
@WithMockUser n'a pas fonctionné.
Tenté par l'annotation des méthodes avec
Sonne comme la répétition du code, comme je l'ai déjà les autoriser dans la sécurité de config, et il n'travail avec des utilisateurs réels, pas dans les tests
Je ne peux pas autowire chaîne de filtre de proxy, ce que je fais mal?
@PreAuthorize("hasPermission('ADMIN')")
Sonne comme la répétition du code, comme je l'ai déjà les autoriser dans la sécurité de config, et il n'travail avec des utilisateurs réels, pas dans les tests
Je ne peux pas autowire chaîne de filtre de proxy, ce que je fais mal?
OriginalL'auteur Jakub Kozłowski | 2015-08-04
Vous devez vous connecter pour publier un commentaire.
Vous ne devez pas ajouter le FilterChainProxy directement. Au lieu de cela, vous devez appliquer
SecurityMockMvcConfigurers.springSecurity()
comme indiqué par la référence. Un exemple est fourni ci-dessous:Le résultat de ceci est:
FilterChainProxy
est ajouté comme unFilter
àMockMvc
(comme vous l'avez fait)TestSecurityContextHolderPostProcessor
est ajoutéPourquoi est
TestSecurityContextHolderPostProcessor
nécessaire? La raison en est que nous avons besoin de communiquer l'utilisateur actuel à partir de la méthode d'essai pour laMockHttpServletRequest
qui est créé. Cela est nécessaire parce que le Printemps de la SécuritéSecurityContextRepositoryFilter
remplacent n'importe quelle valeur surSecurityContextHolder
à la valeur trouvée par le courantSecurityContextRepository
(c'est à dire laSecurityContext
dansHttpSession
).Mise à jour
Rappelez-vous tout ce qui contient rôle dans le nom de la méthode ajoute automatiquement le préfixe "ROLE_" à la chaîne qui a été passé.
En fonction de votre commentaire, le problème est que vous devez mettre à jour votre configuration à utiliser hasRole au lieu de hasAuthority (depuis votre annotation à l'aide de rôles):
Sinon
Vous au Printemps de Sécurité 4.0.2+ que vous pouvez utiliser:
Pouvez-vous fournir un lien vers une nouvelle question ou de mettre à jour votre configuration?
En fait, j'ai tout compris. Voir la udpate
Je suis en effet en utilisant les autorités dans ma config, mais en changeant de
roles
àauthorities
ici n'aide pas - 302 /login le temps. J'ai un gradle dépendance pour le printemps-sécurité-web:4.0.2.La LIBÉRATION.Merci de poster une nouvelle question avec tous les détails. Vous pouvez afficher le lien dans les commentaires et je vais vous répondre
OriginalL'auteur Rob Winch
Ok, compris.
Cela fonctionne maintenant.
@WithMockUser(roles="ADMIN")
comme expliqué dans les documents référencésLa chose est - @WithMockUser(rôles = "UTILISATEUR") ne fonctionne pas avec la méthode, contrairement à(l'utilisateur(...)). Aussi, mockMvc.effectuer(get("/admin/santé").avec(l'utilisateur("utilisateur").rôles("ADMIN"))).andExpect(état().isOk()); ne fonctionne pas non plus. Je suis totalement ne pas l'obtenir
Où est l'utilisateur statique() définie (Eclipse échoue totalement statique)
Hey, c'est
org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user
, probablement à partir de laspring-security-test
de la bibliothèque..with(user("user"))
ignore toute sorte de permission ou le rôle de la fonction de sécuritéOriginalL'auteur Jakub Kozłowski