最近项目需要上java web service的安全机制,并且要和.net wcf集成。这还真是一个让人觉得有挑战的事情。

搞了几天cxf的web service security后发现它有一个bug,不能同时传username token和进行证书加密。不爽。原因是只有一个userName可以设置。

记得当时很郁闷。而且还有一个让我不爽的事情。在公司轻松配出签名,username token,但是死活配不出sig+encryption。一会是jar包不对,我得下个jar包override jdk的jar包。一会是加密算法不支持。我又下policy jar和改配置,下第三方provider包去作为加密的实际执行。折腾了一天都没有搞定。最最郁闷的事情是回家一配,简直是一配就好。不用override jaxb包,不用改policy文件。而且我清楚的记得公司的jre是1.6和家里一样。

鉴于碰到的问题,又看了看其他的方案。Spring ws说是提倡wsdl first,我又不是集成遗留系统,所以不予采纳。axis说是一样用wss4j,我都怕了,也没有细看。

我想封装的东西还是不保险。不如直接看底层吧。于是看xwss和jax ws,wsit。xwss的文档明显看着比cxf好多了,handler的作用也是清清楚楚,不像cxf有些语义不清。最后的方案定下来是jax ws加xwss搞定。

做的过程真是可以用一句峰回路转来形容。碰到一个问题,解决一个,马上又是一个新问题。基本上都快崩溃了。我的想法是用standalone的code直接做安全。但是大多数的教程都是部署在server里的。而且基本没有什么好的文档讲怎么手工用code实现安全和一些内部机理。

比如说我现在还是不知道自定义的handler什么时候执行。这点就不如cxf了,至少cxf的phase清清楚楚的说明了handler的顺序。[这个最近有了新的认识,protocol handler and logic handler]

然后就是那个经典的mustunderstood=1的问题。搞了好久,还是不明白为什么。基本上网上的方案都试了。

最后灵光一现,决定jar要尽可能从同一个产品中引用。于是下了一个jwsdp,然后所有的包都是引用里面的。不过有一个例外。还用了一个sun jdk的jar包。最后的最后,终于通了。

这次实践的总结:

1 一定要在对所有流行的解决方案有个熟悉的时候,在深入看一两个。
2 不在迷信open source的易用性。封装未必会简化开发。
3 java世界里jar还是比较乱的。尽可能用同一个product的lib下的jar包。这个太变态了,经常一个名字有n多重名实现。不知道大家平时开发时怎么解决这个问题。
4 不论用不用底层的技术,还是应该先看看底层的技术,因为上层的封装都是依赖于底层的,而且很多思想也是来源于底层。