> -----Original Message-----
> From: Sergey Beryozkin [mailto:[email protected]]
> Sent: Tuesday, October 29, 2013 8:09 AM
>
> SecureAnnotationsInterceptor is at the PRE_INVOKE stage, so I wonder
> how the call reaches it when WADL is requested, given that
> JAXRSInInterceptor which runs a WADL filter is at the earlier UNMARSHAL
> stage.

I just debugged this. CXF 2.7.7 calls AbstractAuthorizingInInterceptor, which 
calls getTargetMethod. It finds that 
m.getExchange().get(BindingOperationInfo.class) and 
m.get("org.apache.cxf.resource.method") return null. Because it cannot perform 
its work it decides to be safe and throw access denied.

In debugger I see that JAXRSInInterceptor's handleMessage is called first. It 
finds a RequestProcessor, and calls its preprocess method, which puts a 
Response onto the Message's exchange which has entity with WADL content, which 
bypasses the rest of JAX-RS logic. Then SecureAnnotationsInterceptor runs and 
throws from its handleMessage, and it seems that this overrides the Response 
generated by JAXRSInInterceptor.

I created a class that extends SecureAnnotationsInterceptor, whose 
handleMessage is below:

void handleMessage(Message message) throws Fault {
  if (!"_wadl".equals(message.get(Message.QUERY_STRING))
    super.handleMessage(message)
}

And now my service "works", but any user calling for example /api/soap?_wadl 
can perform any SOAP operation. I could check for "org.apache.cxf.rest.message" 
property, but I'd rather find a better approach than risk making a security 
flaw.

I should also note that my goal here is only to get CXF + spring-security to 
work at all. SecureAnnotationsInterceptor was my backup plan. I initially tried 
<sec:global-method-security jsr250-annotations="enabled"/> in the beans XML, 
but this causes an InternalServerErrorException thrown from at 
org.apache.cxf.jaxrs.utils.InjectionUtils.reportServerError(InjectionUtils.java:457)
 in cxf-rt-frontend-jaxrs-2.7.7 jar, the real cause is line 302 
(injectThroughMethod), where it catches an exception because Spring Security 
creates a proxy, and CXF has a reference to the Method from the real class, and 
calling realMethod.invoke(proxy, ...) fails because the proxy's class does not 
extend realMethod's class. This might be due to a @Context method setUriInfo on 
the implementation class rather than the interface. This method would probably 
be better if possible, because I'd like to use an exception mapper, which 
doesn't appear possible via the interceptor method.

Jason

----------------------------------------------------------------------
This email message and any attachments are for the sole use of the intended 
recipient(s). Any unauthorized review, use, disclosure or distribution is 
prohibited. If you are not the intended recipient, please contact the sender by 
reply email and destroy all copies of the original message and any attachments.

Reply via email to