Endpoint con Jersey.Come imitare un SecurityContext
Voglio garantire un endpoint con un ContainerRequestFilter
@Provider
@Secured
public class AuthorizationRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
final SecurityContext securityContext =
requestContext.getSecurityContext();
//TODO: on logger here...
System.out.printf("Filtering %s request... AuthorizationRequestFilter\n", requestContext.getMethod());
requestContext.getHeaders().add("X-Secured-By", "Jersey >_<");
System.out.printf("SecurityContext: %s (%s).\n", securityContext, securityContext.getAuthenticationScheme());
if (securityContext == null || !securityContext.isUserInRole("privileged")) {
requestContext.abortWith(new UnauthorizedResponse().getResponse());
}
}
}
L'annotazione @Secured
:
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Secured {}
modo che io possa fare questo:
@Path("foobar")
public class FooResource {
//...
@Context
SecurityContext securityContext;
//...
@GET
@Secured
@Path(value = "foo")
@Produces(MediaType.APPLICATION_JSON)
public Response getFoo(@Context SecurityContext sc, @Context UriInfo ui, @Context HttpHeaders hh) {
// ...
}
//...
E lo sto facendo giusto (credo), perché con il mio test non passo nemmeno attraverso lo getFoo
endpoint, ma è ContainerRequestFilter che mi dà il via. In realtà ricevo questo (la "X-Secured-By" intestazione è fatto a mano):
Headers: {X-Secured-By=[Jersey >_< kicked you out!], Content-Length=[97], Date=[Wed, 03 Dec 2014 17:46:50 GMT], Content-Type=[application/json], X-Powered-By=[Jersey ^_^]}
Response: InboundJaxrsResponse{ClientResponse{method=GET, uri=http://localhost:9998/urler/test, status=401, reason=Unauthorized}}
Ora sarebbe bello prendere in giro il SecurityContext
. Questo è quello che sto facendo ... e se sono qui, è ovviamente sciocco e/o sbagliato.
public class UrlerResourceTest extends JerseyTest {
//....
@Override
public TestContainerFactory getTestContainerFactory() {
GrizzlyTestContainerFactory grizzlyTestContainerFactory = new GrizzlyTestContainerFactory();
System.out.printf("The GrizzlyTestContainerFactory: %s ", grizzlyTestContainerFactory);
// just for debugging...
return grizzlyTestContainerFactory;
}
@Test
public void testSecuredEndpoint() throws JSONException {
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
Mockito.when(securityContext.isUserInRole(anyString())).thenReturn(true);
Mockito.when(securityContext.getAuthenticationScheme()).thenReturn("Just Mocking...");
ReflectionTestUtils.setField(resource, "securityContext", securityContext, SecurityContext.class);
final Response response = target("foobar")
.path("foo")
.request(MediaType.APPLICATION_JSON)
.get();
System.out.println(getFormattedStringResponseInfo(response));
JSONObject entity = new JSONObject(response.readEntity(String.class));
assertTrue(entity.get("secured").equals(true));
assertTrue(response.getHeaders().containsKey("X-Secured-By"));
assertEquals(Status.OK.getStatusCode(), response.getStatus());
}
Come posso simulare il SecurityContext
nei test?
Grazie mille in anticipo.
Grazie @peeskillet ... e con la tua nota su come deridere il 'ContainterRequestContext' mi hai dato una buona idea ... – zeroed
@peeskillet, voglio baciarti. Ovunque cerco soluzioni relative a Jersey, incontro le tue utili risposte! Grazie! – erwineberhard
@erwineberhard Potrei dover iniziare a caricare presto :-) –