2017-10-18 19 views
1

私はOAuth 2.0でスプリングブート1.5.6を使用しています。問題は、私が以下のテストケースを実行すると、認証オブジェクトの下にNullポインター例外が発生することです。スプリングテストケースで認証を渡す方法

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

テストクラス

@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)); 
     } 
} 

休憩コントローラー

@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 
@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; 
    } 

上記のテストケースで認証オブジェクトを渡す方法は?

+0

あなたはこれまでの解決策を見つけましたか?私は現在同じ問題で苦労しています。 – AgentBawls

答えて

1

テストで@WithMockUser注釈を使用できます。例えば

:あなたは春、セキュリティコントローラ内でSystem.out.println(authentication.getName());、その後"user/" + userId + "/profile"エンドポイントに設定され、有効になっていると仮定すると、

@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)); 
    } 

が印刷されます:adminを。

詳細はSpring Securty docsを参照してください。

+0

@WithMockUserを追加したあとも、私はまだヌルポインタ例外を受け取ります – Moazzam

+0

あなたはスプリングセキュリティが設定されておらず、user/"+ userId +"/profile "エンドポイントに対して有効になっていると思われます。アプリケーションを実行すると、つまりテスト実行ではなく_real_が実行されるとどうなりますか?認証もnullですか?もしそうなら、問題は '@ WithMockUser'ではありません。いずれにしても、これまでの情報では何が間違っているのかを診断することは不可能です。 [MCVE](https://stackoverflow.com/help/mcve)を提供するために質問を更新できますか?あなたのpom.xmlとSpring Securityのconfogurationが見つかりませんでした。 – glytching

+0

私は、user/"+ userId +"/profile "'に対してセキュリティが有効になっていることがわかるオリジナルの質問を更新しました。アプリケーションは実際にはOAuth 2.0とシングルサインオン機能を使用しています。実際にはうまく動作します。 – Moazzam

関連する問題