2015-05-27 19 views
5

Próbuję zaimplementować niestandardowego bezstanową uwierzytelnianie ze sprężyną bezpieczeństwa wykonując ten articleWiosna zabezpieczeń nie dzwoni mój filtru niestandardowego uwierzytelniania przy uruchamianiu testów JUnit

Problem mam skierowane jest zwyczaj, że mój filtr nie jest nazywany ramami, nawet gdy moja SecurityConfig wygląda prawie tak samo jak w poprzednim linku (nieco prostsze):

@Configuration 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    @Qualifier("appAuthenticationProvider") 
    private AuthenticationProvider authenticationProvider; 

    @Autowired 
    @Qualifier("appAuthenticationFilter") 
    private AppAuthenticationFilter appAuthenticationFilter; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
     .csrf().disable(). 
     sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
     .and() 
     .authorizeRequests().anyRequest().authenticated() 
     .and() 
     .anonymous().disable() 
     .exceptionHandling().authenticationEntryPoint(unauthorizedEntryPoint()); 

     http.addFilterBefore(appAuthenticationFilter, BasicAuthenticationFilter.class); 
    } 

    @Bean 
    public AuthenticationEntryPoint unauthorizedEntryPoint() { 
     return (request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } 
} 

i nie pisać kod authenticationProvider i appAuthenticationFilter jako dawne działa poprawnie (mogę zalogować się używając punktu końcowego/logowania), a drugie tylko implementuje GenericFilterBean i nie jest nawet wywoływane.

Każda pomoc będzie bardzo ceniona!

Odpowiedz

4

Ok, znalazłem rozwiązanie, gdy zauważyłem, że filtry były wykonywane podczas wdrażania aplikacji Spring Boot i nie były wywoływane tylko podczas uruchamiania testów. Potem znalazłem ten wpis:

https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security

zapomniałem skonfigurować mojego mock MVC użyć filtrów. Więc w końcu moja klasa test dla uwierzytelniania wygląda następująco:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = GasApplication.class) 
@WebAppConfiguration 
public class LoginControllerTest { 

    @Autowired 
    private WebApplicationContext context; 

    @Autowired 
    @Qualifier("appAuthenticationFilter") 
    private Filter appAuthenticationFilter; 

    private MockMvc mockMvc; 

    @Before 
    public void init() throws Exception { 
     this.mockMvc = MockMvcBuilders.webAppContextSetup(context) 
       .addFilter(appAuthenticationFilter, "/resource") 
       .build(); 
    } 

    // Tests here... 
} 
1

Aby nie autowire i skonfigurować filtr przez ręce jak w poprzedniej odpowiedzi, można użyć SecurityMockMvcConfigurers.springSecurity():

MockMvcBuilders 
.webAppContextSetup(context) 
.apply(SecurityMockMvcConfigurers.springSecurity()) 
.build();