Printemps de démarrage, désactiver la sécurité pour des tests
- Je utiliser de printemps version de démarrage "1.3.0.M5" (j'ai aussi essayé la version "1.2.5.LIBÉRATION"). J'ai ajouté de la sécurité printemps:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
et code:
@SpringBootApplication
public class SpringBootMainApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMainApplication.class, args);
}
}
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/sampleentity").authenticated()
.and().authorizeRequests()
.and().formLogin().permitAll()
.and().logout().permitAll().logoutUrl("/logout")
.logoutSuccessUrl("/");
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
@RestController
@RequestMapping("/api/sampleentity")
public class SampleEntityController {
@RequestMapping(method= RequestMethod.GET)
public Iterable<SampleEntity> getAll() {
return ImmutableSet.of();
}
@RequestMapping(method=RequestMethod.POST)
@ResponseStatus(value= HttpStatus.CREATED)
public SampleEntity create(@RequestBody SampleEntity sampleEntity) {
return sampleEntity;
}
}
et de test qui est en échec lors de la /api/sampleentity d'accès est: org.springframework.web.client.HttpClientErrorException: 403 Forbidden (...)
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringBootMainApplication.class)
@WebAppConfiguration
@IntegrationTest({"server.port=0"})
public class SampleEntityTest {
@Value("${local.server.port}")
private int port;
private String url;
private RestTemplate restTemplate;
@Autowired
private ApplicationContext context;
@BeforeClass
public static void authenticate(){
//ONE TRY
// Authentication authentication =
// new UsernamePasswordAuthenticationToken("user", "password",
// AuthorityUtils.createAuthorityList("USER")); //tried "ROLE_USER"
// SecurityContextHolder.getContext().setAuthentication(authentication);
}
@Before
public void setUp() {
url = String.format("http://localhost:%s/api/sampleentity", port);
restTemplate = new RestTemplate();
//ANOTHER TRY
// AuthenticationManager authenticationManager = context.getBean(AuthenticationManager.class);
// Authentication authentication = authenticationManager
// .authenticate(new UsernamePasswordAuthenticationToken("user", "password", AuthorityUtils.createAuthorityList("USER"))); //tried "ROLE_USER"
// SecurityContextHolder.getContext().setAuthentication(authentication);
}
//THIS METHOD SHOULD WORK !
@Test
//ANOTHER TRY
//@WithMockUser(username="user",password = "password", roles={"USER"})//tried "ROLE_USER"
public void testEntity_create() throws Exception {
SampleEntity sampleEntity = create("name", 1);
ResponseEntity<SampleEntity> response = restTemplate.postForEntity(url, sampleEntity, SampleEntity.class);
assertEquals(HttpStatus.CREATED, response.getStatusCode());
}
private SampleEntity create(String name, int id) {
SampleEntity entity = new SampleEntity();
entity.setName(name);
entity.setId(id);
return entity;
}
}
Quand je lance l'application de main() et l'accès à l'url:
http://localhost:8080/api/sampleentity
Je suis redirigé vers la page de connexion.
Comment puis-je faire fonctionner mon test et désactiver la sécurité ou connectez-vous simplement à l'utilisateur ?
--ma solution: exclure de la sécurité de l'essai à l'aide de profils:
@SpringBootApplication
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class})
public class SpringBootMainApplication {body the same}
@EnableWebSecurity
@Import(SecurityAutoConfiguration.class)
@Profile("!test")
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {body the same}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringBootMainApplication.class)
@WebAppConfiguration
@IntegrationTest({"server.port=0"})
@ActiveProfiles("test")
public class SampleEntityTest {body the same}
SALUT! avez-vous une solution à son problème : stackoverflow.com/questions/53774909/... . toute aide sera appréciée.
OriginalL'auteur Hollow.Quincy | 2015-10-05
Vous devez vous connecter pour publier un commentaire.
Que vous avez à faire quelques modifications à votre configuration et de test pour résoudre votre problème(s).
D'abord je vais vous expliquer pourquoi votre solution ne fonctionne pas:
RestTemplate
classe est une voie possible pour accéder à votre service de REPOS, mais il manque certaines informations d'en-tête de la façon dont il est construit (ce Qui ne veut pas dire qu'il est impossible avec laRestTemplate
). C'est pourquoi l'authentification ne fonctionne pas.RestTemplate
classe, comme leRestTemplate
demande est de nature à créer une nouvelle session. Il définit un environnement complètement différent. Mon code fonctionne si vous souhaitez tester des Méthodes sécurisées avec la@PreAuthorize
annotation, mais seulement si vous voulez exécuter une méthode directement dans votre test et vous avez besoin d'une authentification valide.Deuxième, voici les modifications nécessaires à votre code:
D'abord la configuration de la classe
J'ai dû ajouter httpBasic en charge de l'Authentification (pour activer l'authentification via http en-tête de l'attribut) et j'ai désactivé les jetons csrf (ce dernier seulement pour des raisons de commodité, vous devez réactiver selon la criticité de votre application).
Et deuxième Testclass:
}
J'ai utilisé le printemps/spring security approche de test ici.
Les Versions utilisées:
Si vous voulez tester votre api rest, je peux vous recommander le Facteur plugin pour Chrome. Comme qui peut vous aider à identifier le problème beaucoup plus rapide.
J'espère que cela vous aide à vous pour enfin résoudre votre problème.
Pouvez-vous l'essayer sans le @WithMockUser ? Et pouvez-vous fournir votre AuthenticationProvider si vous avez une implémentation personnalisée?
Salut, c'3 liens ont été faites séparément (donc j'ai commenté @WithMockUser). Je n'utilise pas coutume AuthenticationProvider.
A l'authentification travaillé quand vous avez commencé à l'application réelle? Oh, et vous devez ajouter le ROLE_ préfixe pour le Rôle, mais voir l'edit de ma réponse pour que
Merci pour la réponse. J'ai mis à jour le code en question (presque tout est dans le post). J'ai essayé vos conseils, mais le résultat est le même. Veuillez lire le code une fois de plus, j'espère que j'ai fait plus propre.
OriginalL'auteur BeWu