Reputation: 4431
I'd like to annotate all of my JAX-RS Resources with some sort of "roles" attribute, that will be read through the context by an access control filter. An example of such a JAX-RS Resource is (psuedo):
@Path("foo")
public class FooResource {
@GET
@Context(roles = "admin,user")
public Response foo() {
return Response.noContent().build();
}
}
Thus, the AccessControlFilter would have access to the resource-specific "roles" value:
public class AccessControlFilter {
@Override
public void filter(ContainerRequestContext context) throws IOException {
String accessToken = accessToken(context);
String roles = context.getContext("roles");
// ... validate access Token against roles ...
}
@Nullable
private static String accessToken(ContainerRequestContext context) {
Map<String, Cookie> cookies = context.getCookies();
Cookie accessTokenCookie = cookies.get("access_token");
if (accessTokenCookie != null) {
return accessTokenCookie.getValue();
}
return null;
}
}
I've been digging around:
Upvotes: 1
Views: 365
Reputation: 209102
Just inject ResourceInfo
into the filter class. From there you can get the resource Method
. Then just use some reflection to get the annotation.
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(...) {
Method method = resourceInfo.getResourceMethod();
MyAnnotation anno = method.getAnnotation(MyAnnotation.class);
if (anno != null) {
String roles = anno.value();
}
}
Upvotes: 1