2017-10-18 4 views
1

J'utilise spring boot 1.5.6 avec OAuth 2.0. Le problème est que lorsque je cours en dessous du cas de test, j'obtiens une exception de pointeur Null en-dessous de la ligne pour l'objet d'authentification.Comment passer l'authentification dans le cas de test de ressort

System.out.println(authentication.getName()); 

classe Test

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = WebApp.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@TestPropertySource(locations = "classpath:test-application.properties") 
public class ProfileControllerTest { 

...... 
...... 

    @Before 
     public void setup() { 
     this.mockMvc = MockMvcBuilders.standaloneSetup(userController).build(); 
     ........... 
     ......... 
     } 

     @Test 
     public void profileTest() throws Exception { 
     String userId = "12345678"; 

     mockMvc.perform(get("user/" + userId + "/profile")) 
     .andExpect(status().isOk()) 
      .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); 
     } 
} 

Rest Controller

@RequestMapping(value = "user/{userId}/profile", 
     method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<Map<String, Object>> getProfile(
     @PathVariable(value = "userId", required = true) String userId, 
     HttpServletRequest request, Authentication authentication) { 
     System.out.println(authentication.getName()); 
    } 

Configuration de la sécurité

@Configuration 
@EnableOAuth2Sso 
@EnableGlobalMethodSecurity(securedEnabled = true) 
public class WebAppSecurityConfig extends WebSecurityConfigurerAdapter { 

    private static final String OAUTH_COOKIE = "OAUTH-ACCESS-TOKEN"; 

    private UserService userService; 
    private OAuth2TokenAuthenticationFilter ssoFilter; 
    private JwtAccessTokenConverter accessTokenConverter; 

    /** 
    * WebAppSecurity overloaded constructor. 
    */ 
    public WebAppSecurityConfig(UserService userService, 
     OAuth2TokenAuthenticationFilter ssoFilter, 
     JwtAccessTokenConverter accessTokenConverter) { 
    this.userService = userService; 
    this.ssoFilter = ssoFilter; 
    this.accessTokenConverter = accessTokenConverter; 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http.anonymous() 
     .disable() 
     .authorizeRequests() 
     .antMatchers("/logout-success") 
     .permitAll() 
     .anyRequest() 
     .authenticated() 
     .and() 
     .csrf() 
     .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 
     .and() 
     .addFilterAfter(ssoFilter, 
      AbstractPreAuthenticatedProcessingFilter.class).logout() 
     .logoutUrl("/logout").logoutSuccessUrl("/logout-success").permitAll() 
     .deleteCookies(OAUTH_COOKIE); 
    } 

    @Autowired 
    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService()); 
    configure((DefaultAccessTokenConverter) accessTokenConverter 
     .getAccessTokenConverter()); 
    } 

    protected void configure(DefaultAccessTokenConverter accessTokenConverter) { 
    DefaultUserAuthenticationConverter userTokenConverter = 
     new DefaultUserAuthenticationConverter(); 
    userTokenConverter.setUserDetailsService(userDetailsService()); 
    accessTokenConverter.setUserTokenConverter(userTokenConverter); 
    } 

    @Override 
    protected UserDetailsService userDetailsService() { 
    return userService; 
    } 

Comment passer l'objet d'authentification dans le cas de test ci-dessus?

+0

avez-vous déjà trouvé une solution? Je me bats avec le même problème actuellement. – AgentBawls

Répondre

1

Vous pouvez utiliser l'annotation @WithMockUser lors de votre test.

Par exemple:

@Test 
    @WithMockUser(username = "admin", roles = { "ADMIN" }) 
    public void profileTest() throws Exception { 
    String userId = "12345678"; 

    mockMvc.perform(get("user/" + userId + "/profile")) 
    .andExpect(status().isOk()) 
     .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)); 
    } 

En supposant que vous avez ressort de sécurité configuré et activé pour le point final "user/" + userId + "/profile" alors System.out.println(authentication.getName()); dans votre contrôleur imprimera: admin.

Plus de détails dans le Spring Securty docs.

+0

Après avoir ajouté @WithMockUser, je reçois toujours l'exception de pointeur nul – Moazzam

+0

Je suppose que vous n'avez pas configuré la sécurité du ressort et activé pour le point de terminaison '" user/"+ userId +"/profile "'. Que se passe-t-il lorsque vous lancez votre application, c'est-à-dire que l'exécution d'un _real_ plutôt que d'un test ... est également une authentification null? Si c'est le cas, le problème n'est pas avec '@ WithMockUser'. De toute façon, il est impossible de diagnostiquer ce qui ne va pas compte tenu des informations que nous avons jusqu'à présent. Pourriez-vous mettre à jour votre question pour fournir un [MCVE] (https://stackoverflow.com/help/mcve)? Il manque actuellement votre pom.xml et votre confoguration de Spring Security ... – glytching

+0

J'ai mis à jour la question originale où vous pouvez voir que la sécurité est activée pour le '' user/"+ userId +"/profile "'. L'application utilise réellement la fonctionnalité OAuth 2.0 et Single Sign On. Cela fonctionne bien dans la course réelle. – Moazzam