axis2 wss4j 例子

同样的,如果你没听说过WSS或不知道什么是WSS请先看一下WSS方面的资料,我在这主要是讲一下如果应用WSS.
在我的WEBSERVICE的例子的基础上我们来实现WSS
首先我们用KEYTOOL生成一对JKS文件,service.jks和client.jks.
service.jks存放了SERVICE的私钥和CLIENT的公钥.
client.jks存放了CLIENT的私钥和SERVICE的公钥.
本人生成的SERVICE的私钥别名是yskyserver,KEYSTORE的密码是111111
SERVICE的公钥别名是yskyserver,KEYSTORE的密码是111111,CLIENT的私钥别名是yskyclient,KEYSTORE的密码是111111,
CLIENT的公钥别名是yskyclient,KEYSTORE的密码是111111.
(注如果不会用KEYTOOL请自己看相关资料,也可以等我的下一篇文章)

在正式开始前还要去下载一个rampart-1.1.mar,把这个东东放到AXIS2_HOME/repository/modules下去
这个东东是在AXIS2上实现WSS4J必需要的一个组件.
再重新生成AXIS2的WAR包


先来看SERVICE服务
首先在services.xml文件中加上WSS的定义
加完内容如下:

<service name="yskyAxis2Service">
    
    <description> The description of the ysky's service  </description>

    <parameter name="ServiceClass"     locked="xsd:false">com.ysky.service.yskyWebService</parameter>
    
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                         class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
      </messageReceivers>
      
      <!--******************************************************************-->
      <module ref="rampart" />
    
    <parameter name="InflowSecurity">
      <action>
        <items>Timestamp Signature Encrypt</items>
        <passwordCallbackClass>com.ysky.service.wss.PWCallback</passwordCallbackClass>
        <signaturePropFile>service.properties</signaturePropFile>
      </action>
    </parameter>
    
    <parameter name="OutflowSecurity">
      <action>
        <items>Timestamp Signature Encrypt</items>
        <user>yskyserver</user>
        <passwordCallbackClass>com.ysky.service.wss.PWCallback</passwordCallbackClass>
        <signaturePropFile>service.properties</signaturePropFile>
        <signatureKeyIdentifier>SKIKeyIdentifier</signatureKeyIdentifier>
        <encryptionKeyIdentifier>SKIKeyIdentifier</encryptionKeyIdentifier>
        <encryptionUser>yskyclient</encryptionUser>
        <encryptionKeyTransportAlgorithm>http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p</encryptionKeyTransportAlgorithm>
      </action>
    </parameter>
    <--*********************************************************************-->
</service>

其中*号注释部份为WSS定义

上面定义中用到了一个叫PWCallback的类内容如下:

package com.ysky.service.wss;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;

public class PWCallback implements CallbackHandler{
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for (int i = 0; i < callbacks.length; i++) {
            if (callbacks[i] instanceof WSPasswordCallback) {
                WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
                    pc.setPassword("111111");
            }
        }
    }
}

在config目录下新建一个keys目录,把我们刚才生成的那个service.jks放到keys目录下
再在config目录下新建一个service.properties文件,内容如下:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=111111
org.apache.ws.security.crypto.merlin.file=keys/service.jks


service端就设置好了

我们再来看一下client端
先把AXIS2的下的所有JAR包加到CLIENT的LIB下面去
再COPY AXIS2_HOME/repository/modules目录到CLIENT/CONFIG下面
在config目录下新建一个keys目录,把我们刚才生成的那个client.jks放到keys目录下
再在config目录下新建一个client.properties文件,内容如下:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=111111
org.apache.ws.security.crypto.merlin.file=keys/client.jks

再在config目录下新建一个client.properties文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>

<axisconfig name="AxisJava2.0">
    <!--******************************************************************-->
    <module ref="rampart" />

    <!-- sample-10 : MTOM optimize encrypted content -->
    
    <parameter name="OutflowSecurity">
      <action>
        <items>Timestamp Signature Encrypt</items>
        <user>yskyclient</user>
        <passwordCallbackClass>com.ysky.client.wss.PWCallback</passwordCallbackClass>
        <signaturePropFile>client.properties</signaturePropFile>
        <signatureKeyIdentifier>DirectReference</signatureKeyIdentifier>
        <encryptionKeyIdentifier>SKIKeyIdentifier</encryptionKeyIdentifier>
        <encryptionUser>yskyserver</encryptionUser>
        <optimizeParts>//xenc:EncryptedData/xenc:CipherData/xenc:CipherValue</optimizeParts>
        <encryptionKeyTransportAlgorithm>http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p</encryptionKeyTransportAlgorithm>
      </action>
    </parameter>

    <parameter name="InflowSecurity">
      <action>
        <items>Timestamp Signature Encrypt</items>
        <passwordCallbackClass>com.ysky.client.wss.PWCallback</passwordCallbackClass>
        <signaturePropFile>client.properties</signaturePropFile>
      </action>
    </parameter>
<!--******************************************************************-->
    <!-- ================================================= -->
    <!-- Parameters -->
    <!-- ================================================= -->
    <parameter name="hotdeployment" locked="false">true</parameter>
    <parameter name="hotupdate" locked="false">false</parameter>
    <parameter name="enableMTOM" locked="false">false</parameter>

    <!--During a fault, stacktrace can be sent with the fault message. The following flag will control -->
    <!--that behaviour.-->
    <parameter name="sendStacktraceDetailsWithFaults" locked="false">true</parameter>

    <!--If there aren't any information available to find out the fault reason, we set the message of the exception-->
    <!--as the faultreason/Reason. But when a fault is thrown from a service or some where, it will be -->
    <!--wrapped by different levels. Due to this the initial exception message can be lost. If this flag-->
    <!--is set then, Axis2 tries to get the first exception and set its message as the faultreason/Reason.-->
    <parameter name="DrillDownToRootCauseForFaultReason" locked="false">false</parameter>

    <!--This is the user name and password of admin console-->
    <parameter name="userName" locked="false">admin</parameter>
    <parameter name="password" locked="false">axis2</parameter>

    <!--To override repository/services you need to uncomment following parameter and value SHOULD be absolute file path.-->
    <!--<parameter name="services" locked="false">service</parameter>-->
    <!--To override repository/modules you need to uncomment following parameter and value SHOULD be absolute file path-->
    <!--<parameter name="modules" locked="false">modules</parameter>-->

    <!--Following params will set the proper context paths for invocations. All the endpoints will have a commons context-->
    <!--root which can configured using the following contextRoot parameter-->
    <!--<parameter name="contextRoot" locked="false">axis2</parameter>-->

    <!--Our HTTP endpoints can handle both REST and SOAP. Following parameters can be used to distinguish those endpoints-->
    <!--<parameter name="servicePath" locked="false">services</parameter>-->
    <!--<parameter name="restPath" locked="false">rest</parameter>-->

    <!--Set the flag to true if you want to enable transport level session management-->
    <parameter name="manageTransportSession" locked="false">false</parameter>

    <!--Following two parameters will be used to handle REST in Axis2. The default settings will make Axis2 to have two-->
    <!--different endpoints, one for REST (AxisRESTServlet) one for SOAP message handling (AxisServlet). But following-->
    <!--parameters help to tweak the message handling of two main servlets. -->

    <!-- If the enableRESTInAxis2MainServlet is true, then Axis2MainServlet will handle both SOAP and REST messages -->
    <parameter name="enableRESTInAxis2MainServlet" locked="true">true</parameter>

    <!-- Following parameter will completely disable REST handling in both the servlets-->
    <parameter name="disableREST" locked="true">false</parameter>

    <!-- This will disable the separate servlet we have for REST handling. -->
    <parameter name="disableSeparateEndpointForREST" locked="true">false</parameter>



    <!-- ================================================= -->
    <!-- Message Receivers -->
    <!-- ================================================= -->
    <!--This is the Default Message Receiver for the system , if you want to have MessageReceivers for -->
    <!--all the other MEP implement it and add the correct entry to here , so that you can refer from-->
    <!--any operation -->
    <!--Note : You can override this for particular service by adding the same element with your requirement-->
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                         class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
    </messageReceivers>

    <!-- ================================================= -->
    <!-- Target Resolvers -->
    <!-- ================================================= -->
    <!-- Uncomment the following and specify the class name for your TargetResolver to add -->
    <!-- a TargetResolver. TargetResolvers are used to process the To EPR for example to -->
    <!-- choose a server in a cluster -->
    <!--<targetResolvers>-->
    <!--<targetResolver class="" />-->
    <!--</targetResolvers>-->


    <!-- ================================================= -->
    <!-- Transport Ins -->
    <!-- ================================================= -->
    <transportReceiver name="http"
                       class="org.apache.axis2.transport.http.SimpleHTTPServer">
        <parameter name="port" locked="false">6060</parameter>
        <!--If you want to give your own host address for EPR generation-->
        <!--uncomment following parameter , and set as you required.-->
        <!--<parameter name="hostname" locked="false">http://myApp.com/ws</parameter>-->
    </transportReceiver>

    <transportReceiver name="tcp"
                       class="org.apache.axis2.transport.tcp.TCPServer">
        <parameter name="port" locked="false">6061</parameter>
        <!--If you want to give your own host address for EPR generation-->
        <!--uncomment following parameter , and set as you required.-->
        <!--<parameter name="hostname" locked="false">tcp://myApp.com/ws</parameter>-->
    </transportReceiver>

    <!-- ================================================= -->
    <!-- Transport Outs -->
    <!-- ================================================= -->

    <transportSender name="jms"
                     class="org.apache.axis2.transport.jms.JMSSender"/>
    <transportSender name="tcp"
                     class="org.apache.axis2.transport.tcp.TCPTransportSender"/>
    <transportSender name="local"
                     class="org.apache.axis2.transport.local.LocalTransportSender"/>
    <transportSender name="http"
                     class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
        <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
        <parameter name="Transfer-Encoding" locked="false">chunked</parameter>
    </transportSender>
    <transportSender name="https"
                     class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
        <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
        <parameter name="Transfer-Encoding" locked="false">chunked</parameter>
    </transportSender>

    <!-- ================================================= -->
    <!-- Phases  -->
    <!-- ================================================= -->
    <phaseOrder type="InFlow">
        <!--  System pre-defined phases       -->
         <phase name="Transport">
            <handler name="RequestURIBasedDispatcher"
                     class="org.apache.axis2.engine.RequestURIBasedDispatcher">
                <order phase="Transport"/>
            </handler>
            <handler name="SOAPActionBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
                <order phase="Transport"/>
            </handler>
        </phase>
        <phase name="Security"/>
        <phase name="PreDispatch"/>
        <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
            <handler name="AddressingBasedDispatcher"
                     class="org.apache.axis2.engine.AddressingBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>

            <handler name="SOAPMessageBodyBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
            <handler name="InstanceDispatcher"
                     class="org.apache.axis2.engine.InstanceDispatcher">
                <order phase="Dispatch"/>
            </handler>
        </phase>
        <!--  System pre defined phases       -->
        <!--   After Postdispatch phase module author or or service author can add any phase he want      -->
        <phase name="OperationInPhase"/>
    </phaseOrder>
    <phaseOrder type="OutFlow">
        <!--      user can add his own phases to this area  -->
        <phase name="OperationOutPhase"/>
        <!--system predefined phase-->
        <!--these phase will run irrespective of the service-->
        <phase name="PolicyDetermination"/>
        <phase name="MessageOut"/>
        <phase name="Security"/>
    </phaseOrder>
    <phaseOrder type="InFaultFlow">
        <phase name="PreDispatch"/>
        <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
            <handler name="RequestURIBasedDispatcher"
                     class="org.apache.axis2.engine.RequestURIBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>

            <handler name="SOAPActionBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>

            <handler name="AddressingBasedDispatcher"
                     class="org.apache.axis2.engine.AddressingBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>

            <handler name="SOAPMessageBodyBasedDispatcher"
                     class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
                <order phase="Dispatch"/>
            </handler>
            <handler name="InstanceDispatcher"
                     class="org.apache.axis2.engine.InstanceDispatcher">
                <order phase="Dispatch"/>
            </handler>
        </phase>
        <!--      user can add his own phases to this area  -->
        <phase name="OperationInFaultPhase"/>
    </phaseOrder>
    <phaseOrder type="OutFaultFlow">
        <!--      user can add his own phases to this area  -->
        <phase name="OperationOutFaultPhase"/>
        <phase name="PolicyDetermination"/>
        <phase name="MessageOut"/>
    </phaseOrder>
</axisconfig>

上面这个文件内容也是我从WSS4J的例子上COPY下来的,有很多地方可能没什么用.但我没有去研究过
其中<!--******************************************************************-->包含的部份是WSS4J用到的
配好了!写个例子看看吧

unittest的例子代码:
public class webserviceTest extends TestCase {
private final String CLIENT_REPO_PATH = "." + File.separator + "config";

    private final String axis2_xml = CLIENT_REPO_PATH + File.separator
            + "client-axis2.xml";

    private static String toEPR = "http://localhost:8080/Axis2Test/services/yskyAxis2Service?wsdl";

    private ConfigurationContext configContext = null;

    private YskyAxis2ServiceStub serviceClient = null;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        configContext = ConfigurationContextFactory
                .createConfigurationContextFromFileSystem(CLIENT_REPO_PATH,
                        axis2_xml);
        serviceClient = new YskyAxis2ServiceStub(configContext, toEPR);
    }

    public void testAuthenticatePass() throws Exception {
        CredentialsMessage msg = new CredentialsMessage();
        msg.setPassword("test");
        msg.setUsername("test");

        Authenticate ath = new Authenticate();
        ath.setParam0(msg);
        assertEquals("testtest", serviceClient.authenticate(ath).get_return());
    }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值