`
zt307484565
  • 浏览: 969 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

记一次webservice 的ws-security开发过程

阅读更多
http://www.blogjava.net/zljpp/archive/2012/04/15/374371.html

ws-security对验证的过程是支持多种方式的,
先写个UsernameToken的

服务端接口
@WebService()
public interface WebServiceSample {
String say(String name);

}
实现类
public class SimpleServiceImpl implements WebServiceSample{

public String say(String name) {
return "hello zhangtao";
}

}
webxml中:
CXF是需要spring支持的
<context-param>
<param-name>contextConfigLocation</param-name>
<!--ws-context.xml(必须)是cxf配置文件, wssec.xml可选,作用可以打印出加密信息类容 -->
<param-value>WEB-INF/ws-context.xml,WEB-INF/wssec.xml</param-value>
</context-param>
还要配置CXF
<url-pattern>/services/*</url-pattern>
是webservice的发布目录

<load-on-startup>0</load-on-startup>
2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5)当值相同时,容器就会自己选择顺序来加载。
///////////////////////
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>


ws-context.xml

<jaxws:endpoint id="webServiceSample" address="/WebServiceSample"
implementor="server.service.impl.SimpleServiceImpl">
<!--inInterceptors表示被外部调用时,调用此拦截器 -->
<jaxws:inInterceptors>
<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<!-- 设置加密类型 -->
<entry key="action" value="UsernameToken" />
<!-- 设置密码类型为明文 -->
<entry key="passwordType" value="PasswordText" />
<!--<entry key="action" value="UsernameToken Timestamp" /> 设置密码类型为加密
<entry key="passwordType" value="PasswordDigest" /> -->
<entry key="passwordCallbackClass" value="server.security.WsAuthHandler" />
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
</jaxws:endpoint>

这里直接就配置实现类了,没看见接口。endpoint的id跟接口名也是没关系的。
配置了两个jaxws:inInterceptors。就是在请求的时候触发
比如打上地址http://zt-pc:8080/ws-security69/services/WebServiceSample
则输出了
2014-6-11 15:05:10 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Address: http://zt-pc:8080/ws-security69/services/WebServiceSample?wsdl
Http-Method: GET
Content-Type:
Headers: {Accept=[application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*], accept-encoding=[gzip, deflate], accept-language=[zh-CN], connection=[Keep-Alive], Content-Type=[null], cookie=[JSESSIONID=A87902CD3C03E42431153E2A8EC32D7F; NavWorkFlowTreeSaveStateCookie=%2C%2F1%2F1_2%2C%2F1%2F1_2%2F1_2_1%2C%2F2%2F2_1%2C%2F2%2F2_1%2F2_1_1%2C%2F2%2C%2F1%2F1_1%2F1_1_1%2C%2F1%2F1_1%2C%2F1], host=[zt-pc:8080], referer=[http://zt-pc:8080/ws-security69/services], user-agent=[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0E; .NET4.0C)]}
可以看见有header了,没有拦截器的时候我记着好像没header。这里用的应该是SOAP协议吧。
<constructor-arg>这是在构造方法中赋值,property是用setter方法赋值(spring的)

wssec.xml用来输出调试信息
<cxf:bus>
<cxf:features>
<cxf:logging />
<wsa:addressing />
</cxf:features>
</cxf:bus>

而在拦截其中指定的自己的类WsAuthHandler,应该是wss4j拦截后交给我了我的类。
实现handle(Callback[] callbacks)此方法
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
String identifier = pc.getIdentifier();
int usage = pc.getUsage();
if (usage == WSPasswordCallback.USERNAME_TOKEN) {// 密钥方式USERNAME_TOKEN
// username token pwd...
// ▲这里的值必须和客户端设的值相同,从cxf2.4.x后校验方式改为cxf内部实现校验,不必自己比较password是否相同
// 请参考:http://cxf.apache.org/docs/24-migration-guide.html的Runtime
// Changes片段
pc.setPassword("testPassword");// ▲【这里非常重要】▲
// ▲PS 如果和客户端不同将抛出org.apache.ws.security.WSSecurityException:
// The
// security token could not be authenticated or
// authorized异常,服务端会认为客户端为非法调用
} else if (usage == WSPasswordCallback.SIGNATURE) {// 密钥方式SIGNATURE
// set the password for client's keystore.keyPassword
// ▲这里的值必须和客户端设的值相同,从cxf2.4.x后校验方式改为cxf内部实现校验,不必自己比较password是否相同;
// 请参考:http://cxf.apache.org/docs/24-migration-guide.html的Runtime
// Changes片段
pc.setPassword("testPassword");// //▲【这里非常重要】▲
// ▲PS:如果和客户端不同将抛出org.apache.ws.security.WSSecurityException:The
// security token could not be authenticated or
// authorized异常,服务端会认为客户端为非法调用
}
//不用做其他操作
}
}
pc.setPassword("testPassword");这是在服务端,这句的意思应该是,比对的时候,把客户端发过来的密码和这个比对

客户端

public static void main(String[] args) {
// 以下和服务端配置类似,不对,应该说服务端和这里的安全验证配置一致
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION,WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "admin");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
// 指定在调用远程ws之前触发的回调函数WsClinetAuthHandler,其实类似于一个拦截器
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,WsClinetAuthHandler.class.getName());

ArrayList list = new ArrayList();
// 添加cxf安全验证拦截器,必须
list.add(new SAAJOutInterceptor());
list.add(new WSS4JOutInterceptor(outProps));

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// WebServiceSample服务端接口实现类,这里并不是直接把服务端的类copy过来,具体请参考http://learning.iteye.com/blog/1333223
factory.setServiceClass(WebServiceSample.class);
// 设置ws访问地址
factory.setAddress("http://zt-pc:8080/ws-security69/services/WebServiceSample");
        //注入拦截器,用于加密安全验证信息
factory.getOutInterceptors().addAll(list);
WebServiceSample service = (WebServiceSample) factory.create();
String response = service.say("2012");
System.out.println(response);
}

public class WsClinetAuthHandler implements CallbackHandler {

public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
System.out.println("identifier: " + pc.getIdentifier());
// 这里必须设置密码,否则会抛出:java.lang.IllegalArgumentException: pwd == null
// but a password is needed
pc.setPassword("testPassword");// ▲【这里必须设置密码】▲
}
}
}
factory.getOutInterceptors().addAll(list);在发出请求的时候拦截,添加了两个
安全验证拦截器。并且在wss4j的outInterceptor中new WSS4JOutInterceptor(outProps)
这些参数原来是跟服务器端对应的

运行后就行了
identity没什么用啊,根据控制台输出看到header中
identity和password都是明文的。
分享到:
评论

相关推荐

    纯java调用ws-security+CXF实现的webservice安全接口

    CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于保护Web服务的标准。 首先,我们要理解ws-security的概念。它是 Oasis Web服务安全技术委员会制定...

    ws-security 和wss4j的jar包

    2. **wss4j-ws-security-dom.jar**:DOM(Document Object Model)版本的WS-Security实现,用于处理基于DOM的XML消息。 3. **wss4j-ws-security-stax.jar**:STAX(Streaming API for XML)版本的实现,适用于处理...

    ws-security 和 wss4j的jar包

    而`wss4j`(Web Services Security for Java)是Apache软件基金会开发的一个开源项目,它是对`ws-security`概念的具体实现。`wss4j`提供了丰富的API,用于在SOAP消息上执行各种WS-Security操作,包括但不限于: 1. ...

    cxf+ws-security-JAR

    综上所述,"cxf+ws-security-JAR"是针对Web服务安全调用的解决方案,通过Apache CXF和WS-Security标准,为Web服务提供了强大的安全保障,确保了敏感数据的传输安全和用户身份的有效验证。这个JAR包很可能包含了一些...

    WS-Security.pdf

    WS-Trust是WS-Security的一个扩展,提供了安全令牌的请求、发布和管理机制。它定义了一组操作和服务,允许应用程序请求和管理用于身份验证的安全令牌,如SAML令牌。WS-Trust增强了WS-Security的功能,使其能够支持更...

    我的cxf与ws-security

    【标题】"我的cxf与ws-security"涉及的是在Java Web服务开发中使用Apache CXF框架集成WS-Security(Web Service Security)的安全机制。Apache CXF是一个开源的、功能丰富的Web服务框架,它允许开发者创建和消费各种...

    Webservice实现WS-Security(XFire)

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/839050

    WS-Security 安全

    例如,BEA WebLogic Workshop 8.1提供了集成的WS-Security支持,而Apache WSS4J结合XFire则适用于开源环境下的应用开发。此外,跨平台的互操作性测试也是实施过程中不可或缺的环节,以确保在不同的系统间可以无缝...

    Cxf 和wss4j实现ws-security的demo

    CXF使用WSS4J实现WS-Security规范,本例的配置是Timestamp Signature Encrypt,具体使用可以参考我的博客http://blog.csdn.net/wangchsh2008/article/details/6708270

    cxf ws-Security的实现

    cxf ws-Security的实现 WS-SecurityPolicy 安全配置指定在客户机和服务之间交换的消息所需的安全处理。在大多数情况下,Web 服务堆栈还需要更多信息,才能对消息交换应用安全措施。 里面有2个project,分别server ...

    WebService------AXIS

    AXIS则是实现WebService的一种流行工具,它是由Apache软件基金会开发的一个开放源码项目,主要用于简化WebService的创建和消费。 AXIS的主要特点和优势包括: 1. **易用性**:AXIS提供了一套简单的命令行工具,...

    webservice之jax-ws

    开发者可以使用诸如Apache CXF、Metro等开源框架来支持JAX-WS的开发,这些框架提供了更多的功能,如WS-Security、WS-Policy等扩展,同时简化了开发过程。 8. **示例** 在提供的链接...

    webservice apache-cxf-3.0.7 jar包

    Apache CXF 是一个开源的Java框架,主要用于构建和开发Web服务。这个项目源自XFire,并在2007年合并到Apache基金会,更名为CXF。CXF允许开发者以SOAP、RESTful、XML/HTTP、WS-*协议等多种方式来实现Web服务。在本...

    WebService CXF --- 由WSDL文件开发Client端

    WebService CXF是一个强大的开源框架,用于创建和消费Web服务。它允许开发者基于WSDL(Web Service Description Language)文件快速地生成服务端和客户端代码,极大地简化了Web服务的开发流程。在本篇中,我们将深入...

    JAX-WS开发部署WebService

    【JAX-WS开发部署WebService】是Web服务开发的一个重要主题,主要涉及到使用Java API for XML Web Services(JAX-WS)创建和部署基于SOAP的Web服务。JAX-WS是一种标准的、Java平台上的API,它使得开发人员能够轻松地...

    jax-ws实现webservice调用

    **Java API for XML Web Services (JAX-WS)** 是一种由Java SE和Java EE平台支持的用于构建Web服务的标准API。它使得开发人员能够轻松地创建、部署和使用基于SOAP(简单对象访问协议)的Web服务。在本教程中,我们将...

    WebService教程-xfire学习手册

    6. **高级特性**:深入探讨XFire的高级特性,如WS-Security(Web服务安全)、WS-ReliableMessaging(可靠消息传递)和WS-Addressing(Web服务寻址)。这些特性对于实现安全、可靠和可管理的Web服务至关重要。 7. **...

    【webservice----xfire 快速入门代码实训】----<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    其中,XFire是一个流行的Java Web服务框架,它简化了开发、部署和消费Web服务的过程。本实训主要关注如何使用XFire快速创建和使用Web服务。 一、Web服务简介 Web服务是一种基于标准的、平台无关的方式,允许不同的...

Global site tag (gtag.js) - Google Analytics