2016-07-12 17 views
1

Ich habe versucht, einen Integrationstest für unsere Spring MVC-Anwendung zu schreiben. Wir verwenden oAuth2 für die Authentifizierung.Java Spring MVC-Integrationstest OAuth2 Principal erstellen

Spring in diesem Fall gibt uns eine Principal Instanz, die wir verwenden, um zu bestimmen, welche Entitäten wir zurück an den Client senden müssen. In unserem Controller haben wir einen Endpunkt:

@RequestMapping("/bookings") 
public @ResponseBody ResponseEntity<List<ThirdPartyBooking>> getBookings(Principal principal) { 
    OAuth2Authentication auth = (OAuth2Authentication) principal; 
    OAuth2AuthenticationDetails authDetails = (OAuthAuthenticationDetails) auth.getDetails(); 
    // Extract stuff from the details... 
} 

Jetzt in unserem Test, den ich sicherstellen möchten, dass wir nur Buchungen für den authentifizierten Benutzer senden. Unter dem Code für den Test kann hier gefunden werden:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = {ThirdPartyBookingServiceConfiguration.class}) 
@WebAppConfiguration 
@Component 
public abstract class RepositoryTestBase { 
    @Resource 
    private WebApplicationContext context; 
    private MockMvc mockMvc; 

    @Before 
    public void setUp() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); 
    } 

    @Test 
    public void shouldOnlyReturnUserBookings() throws Exception { 
     MockHttpServletResponse result = mockMvc.perform(MockMvcRequestBuilders.get("/bookings").principal(???)).andReturn().getResponse(); 
     // Validate the response 
    } 
} 

Wie würde ich einfügen einer OAuth2Authentication am ????

Antwort

1

Ich verwende RequestPostProcessor für Testauthentifizierung. Fügen Sie einfach Stub-Token auf Anfrage:

@Component 
public class OAuthHelper { 

    @Autowired 
    AuthorizationServerTokenServices tokenservice; 

    public RequestPostProcessor addBearerToken(final String username, String... authorities) 
    { 
     return mockRequest -> { 
      OAuth2Request oauth2Request = new OAuth2Request(null, "client-id", 
         null, true, null, null, null, null, null); 
      Authentication userauth = new TestingAuthenticationToken(username, null, authorities); 
      OAuth2Authentication oauth2auth = new OAuth2Authentication(oauth2Request, userauth); 
      OAuth2AccessToken token = tokenservice.createAccessToken(oauth2auth); 

      mockRequest.addHeader("Authorization", "Bearer " + token.getValue()); 
      return mockRequest; 
     }; 
    } 
} 

Und es in Tests verwenden:

accessToken = authHelper.addBearerToken(TEST_USER, TEST_ROLE); 
    mockMvc.perform(get("/cats").with(accessToken)) 
+0

Das war nicht genau das, was ich suchte. Es hat sehr geholfen. Vielen Dank! – irundaia

Verwandte Themen