Hi Josh,

Sounds like you need a custom intent.

An intent is simply a string that identifies some QoS that should be enabled
on the local proxy or is required by the remote service. The desired intents
are specified via a space-separated list provided as a property on the
service lookup (check with DavidB for the latest property name, these have
been changing recently due to some churn in the specification process).

Now dOSGi uses a master intent map, that's retrieved from
/OSGI-INF/cxf/intents/intent-map.xml in the DSW bundle.

But you can provide your own application-specific intents in the calling
bundle (same path as above) which would then be merged with the master map.

As you can see from [1], the intent map is simply a string-to-bean map where
the key is a string intent name and the value is a CXF Feature, list of
WS-Policy assertions or a BindingConfiguration.

So your custom map could look something like this:

<beans xmlns="http://www.springframework.org/schema/beans";
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
       xmlns:auth="http://holtzman.org/auth";
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd";>

    <bean id="intentMap" class="org.apache.cxf.dosgi.dsw.qos.IntentMap">
       <property name="intents">
         <map>
           <entry key="authorization" value-ref="joshAuth"/>
         </map>
       </property>
    </bean>

    <auth:authorization id="joshAuth"/>
</beans>

Then your authorization feature would simply install the required
interceptors, on the individual proxy created for the remote service.

You can model your feature implementation on the WSAdedressingFeature[2],
which is one of the simplest in CXF.

You'll also need need a META-INF/spring.handlers file mapping your namespace
to a handler class, e.g.:

http\://holtzman.org/auth=org.holtzman.auth.spring.NamespaceHandler

Then just base the namespace handler and bean definition parser on the WS-A
analogues ([3], [4]).

Hope this helps!

Cheers,
Eoghan

[1]
http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/resources/OSGI-INF/cxf/intents/intent-map.xml?view=co
[2]
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/WSAddressingFeature.java?view=co
[3]
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/spring/NamespaceHandler.java?view=co
[4]
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/spring/AddressingBeanDefinitionParser.java?view=co

2009/6/18 Josh Holtzman <[email protected]>

> I'm trying to figure out how best to apply aspects like authentication and
> authorization to my distributed OSGi services using CXF.  Since I won't
> know
> which services are deployed locally or remotely until the osgi container is
> running, I don't think servlet filters are the right approach (the filter
> would be bypassed for local service invocations).
>
> I'm pretty sure that each service that is exposed as a remote endpoint via
> DOSGI has its own CXF Bus.  So I should be able to add interceptors to the
> buses generated by the CXFNonSpringServlets.  But I think these buses are
> bypassed when the service is locally invoked, so the CXF interceptor
> approach doesn't work either.
>
> Does anyone have suggestions for applying aspects to (D)OSGI services?  I'm
> about to read up on the new Find hooks available in the osgi 4.2 spec,
> since
> I might be able to sneak a proxy into service location, but I don't want to
> give up on a CXF based solution if there is one.
>
> Thanks,
> Josh
>

Reply via email to