<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    使用axis的Handler進行訪問控制

    axis為Web服務的訪問控制提供了相關的配置描述符,并且提供了一個訪問控制的簡單Handler(關于Handler的詳細介紹見" J2EE Web服務開發(fā)系列之六: 使用Handler來增強Web服務的功能")。默認情況下,你只要在配置描述符中添加用戶,然后在Web服務器的部署描述符中自動允許的角色即可。

    首先在axis的配置文件users.lst(位于WEB-INF目錄下)中添加一個用戶,如"axisuser pass",表示用戶名為axisuser,密碼為pass。然后把案例的Web服務重新部署,在server-config.wsdd中添加例程7所示的部署代碼。


    例程7 重新部署PersonalTaxService

      <service name="PersonalTaxService2" provider="java:RPC">
      <parameter name="allowedMethods" value="*"/>
        <parameter name="className" value="com.hellking.study.webservice.PersonalTaxService"/>
          <parameter name="allowedRoles" value="axisuser"/>
        <requestFlow>
        <handler name="authen"
     type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
        </requestFlow>
      </service>
      


    在這個部署描述符中,指定PersonalTaxService2服務只能被axisuser訪問,要想使訪問控制生效,還必須把SimpleAuthenticationHandler添加到請求Handler鏈中。

    你只要修改AuthClient代碼的服務端點URL和訪問用戶名、密碼,就可以測試新的Web服務了,如例程8所示。


    例程8 HandlerAuthClient

    public class HandlerAuthClient
    {
    。。。 
    String endpointURL = "http://localhost:8080/axis/services/PersonalTaxService2?wsdl";
          。。。
       call.getMessageContext().setUsername("axisuser");//axis中的用戶名。
       call.getMessageContext().setPassword("pass");//密碼
    。。。
     


    執(zhí)行HandlerAuthClient,能夠順利訪問Web服務;如果修改用戶名或者密碼,那么就不能訪問,這說明Axis的Handler對Web服務的訪問權限進行了有效的控制。

    使用Servlet過濾器(Filter)進行訪問控制 Axis的Web服務端本質上是以Servlet方式在運行,所有我們完全可以在Web應用上部署一個Servlet過濾器,通過此過濾器來達到訪問控制的效果。

    Web應用中的過濾器截取從客戶端進來的請求,然后進行一系列處理,最后把請求發(fā)送到目標Servlet。過濾器的工作原理如下圖所示。


    圖1 過濾器工作原理
     

    過濾器可以說是外部進入Web服務器的第一道關,它能決定請求是否繼續(xù)向前轉發(fā),也能對請求中的信息進行處理。如果過濾器用于對Web服務進行訪問控制,那么它能根據(jù)客戶端信息決定目標的服務是否能調用成功。

    將要開發(fā)的過濾器將根據(jù)客戶端IP地址進行過濾,如果客戶端的IP地址在限制范圍中,那么就不能訪問目標的Web服務。過濾器部分代碼如下。


    例程9 用過濾器限制Web服務的訪問權限

    package com.hellking.study.webservice;

    import javax.servlet.FilterChain;
    。。。
    public class WebServicesFilter implements Filter
    {
         //沒有權限訪問的IP地址
        static final String[] deniedIPList=new String[]{
                           "123.201",
                           "192.168",
                           "25.46",
                           "124.0.0.1"
                        };   
         public boolean isIPDenied(String ipAddr)
         {
             …
         }
       
        //過濾處理的方法
        public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)
            throws IOException,ServletException
        {
             HttpServletRequest hreq = (HttpServletRequest)req;
             HttpServletResponse hres = (HttpServletResponse)res;
             //HttpSession session = hreq.getSession();
             String clientIp=req.getRemoteAddr();
             System.out.println("開始過濾。。。");
             if(isIPDenied(clientIp))
             {
                  //驗證不成功,讓用戶登錄。
                 throw new ServletException("無權限訪問此Web服務!");
              }       
             else
                 {
                     //驗證成功,繼續(xù)處理
                   chain.doFilter(req,res);            

                 }     
                
        }   
        …
    }
     


    WebServicesFilter 過濾器限制了deniedIPList中指定的所有客戶端。編寫了過濾器后,需要在Web應用的部署描述符中指定使用此過濾器,并且把過濾器映射到目標URL上。當然,你也可以開發(fā)其它過濾器進行訪問控制,比如Web服務客戶端登錄時,把登錄信息保存在HTTP會話中,當客戶端訪問受限的資源時,讀取HTTP會話中客戶端信息以決定客戶端是否有權限訪問目標資源。

    除了編寫Servlet過濾器實現(xiàn)類外,還需要在web.xml中對它進行配置,并且把過濾器映射到要過濾的目標URI上。以下是過濾器的部署描述符。


    例程10 部署過濾器

        <filter>
            <filter-name>WebServicesFilter</filter-name>
            <filter-class>com.hellking.study.webservice.WebServicesFilter</filter-class>
        </filter>   
        <filter-mapping>
            <filter-name>WebServicesFilter</filter-name>
            <url-pattern>/services/*</url-pattern>
        </filter-mapping>
        


    url-pattern指定了過濾器要過濾的范圍。"/services/*"表示以"/services"開始的URL將全部被過濾,這正是AxisServlet默認的URL。通過上面的配置,只要客戶端調用axis Web服務,就會被WebServicesFilter過濾器過濾。如果客戶端IP地址在過濾器的deniedIPList中,那么就不能訪問目標服務。



    使用SSL作為Web服務的傳輸協(xié)議

    Web服務也可以使用SSL作為傳輸協(xié)議。雖然JAX-RPC并沒有強制規(guī)定是否使用SSL協(xié)議,但在tomcat下使用HTTPS協(xié)議。

    相關知識:

    SSL由兩個共同工作的協(xié)議組成:"SSL 記錄協(xié)議"(SSL Record Protocol)和"SSL 握手協(xié)議"(SSL Handshake Protocol)。SSL 記錄協(xié)議建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持;SSL 握手協(xié)議建立在SSL記錄協(xié)議之上,用于在實際的數(shù)據(jù)傳輸開始前,通信雙方進行身份認證、協(xié)商加密算法、交換加密密鑰等。

    SSL握手協(xié)議包含兩個階段,第一個階段用于建立私密性通信信道,第二個階段用于客戶認證。第一階段是通信的初始化階段,在此階段,首先SSL要求服務器向瀏覽器出示證書;然后瀏覽器中的SSL軟件發(fā)給服務器一個隨機產生的傳輸密鑰,此密鑰由已驗證過的公鑰加密,隨機產生的傳輸密鑰是核心機密,只有客戶的瀏覽器和此公司的Web服務器知道這個數(shù)字序列。第二階段的主要任務是對客戶進行認證,此時服務器已經被認證了。服務器方向客戶發(fā)出認證請求消息。客戶收到服務器方的認證請求消息后,發(fā)出自己的證書,并且監(jiān)聽對方回送的認證結果。而當服務器收到客戶的證書后,給客戶回送認證成功消息,否則返回錯誤消息。到此為止,握手協(xié)議全部結束。

    要使用SSL協(xié)議,服務器至少有一個私有密匙和一個用于驗證身份的證書。私有密匙在密匙交換算法中用到,證書將發(fā)送到客戶端,以通知服務器端的身份。如果SSL服務器要驗證客戶端的身份,那么客戶端必須也有自己的密匙庫(包含私有密匙和證書)。JSSE中引入了信任庫(truststore)的概念,它是用來保存證書的數(shù)據(jù)庫。客戶端或者服務器通過信任庫來驗證對方的身份。

    在使用SSL前,必須確保系統(tǒng)安裝了JSSE。JDK1.4版本默認以及安裝了JSSE。如果沒有安裝,把下載安裝好的jar文件拷貝到%JAVA_HOME%\ jre\lib\ext目錄下。這樣,就安裝好了JSSE的運行環(huán)境。

    下面我們使用JDK自帶的工具創(chuàng)建密匙庫和信任庫。

    1)通過使用一下的命令來創(chuàng)建服務器端的密匙庫。


            keytool -genkey -alias hellking -keystore server.keystore -keyalg RSA
    輸入keystore密碼:  changeit
    您的名字與姓氏是什么?
      [Unknown]:  hellking-Server
    您的組織單位名稱是什么?
      [Unknown]:  huayuan
    您的組織名稱是什么?
      [Unknown]:  huayuan
    您所在的城市或區(qū)域名稱是什么?
      [Unknown]:  beijing
    您所在的州或省份名稱是什么?
      [Unknown]:  beijing
    該單位的兩字母國家代碼是什么
      [Unknown]:  cn
    CN=chen ya qiang, OU=huayuan, O=huayuan, L=beijing, ST=beijing, C=cn 正確嗎?
      [否]:  y

    輸入<hellking>的主密碼
            (如果和 keystore 密碼相同,按回車):
            


    以上命令執(zhí)行完成后,將獲得一個名為server.keystore的密匙庫。

    2)生成客戶端的信任庫。首先輸出RSA證書:


    keytool -export -file test_axis.cer -storepass changeit -keystore server.keystore
     


    然后把RSA證書輸入到一個新的信任庫文件中。這個信任庫被客戶端使用,被用來驗證服務器端的身份。


    keytool -import -file test_axis.cer -storepass changeit -keystore client.truststore -alias serverkey -noprompt
     


    3)創(chuàng)建客戶端密匙庫。重復步驟1,創(chuàng)建客戶端的密匙庫。也可以使用以下命令來完成:


    keytool -genkey -dname " CN=hellking-Client, OU=tsinghua, O=tsinghua, L=BEIJING, S=BEIJING, C=CN"
    -storepass changeit -keystore client.keystore -keyalg RSA -keypass changeit
     


    4)生成服務器端的信任庫。


    keytool -export -file test_axis.cer -storepass changeit -keystore client.keystore
    keytool -import -file test_axis.cer -storepass changeit -keystore server.truststore -alias clientkey -noprompt
     


    生成了密匙庫和信任庫,我們把服務器端的密匙庫(server.keystore)和信任庫(server.truststore)拷貝到Tomcat的某個目錄。

    下面需要更改Tomcat的配置文件(server.xml),增加一下部署描述符:


    例程11 為Tomcat配置SSL協(xié)議。

                      <Connector port="8443"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" disableUploadTimeout="true"
                   acceptCount="100" debug="0" scheme="https" secure="true"
                   clientAuth="true" keystoreFile="K:\jakarta-tomcat-5.0.16\server.keystore" keystorePass="changeit"
                     truststoreFile="K:\jakarta-tomcat-5.0.16\server.truststore" truststorePass="changeit"
                   sslProtocol="TLS" />
                   


    clientAuth參數(shù)制定服務器是否要驗證客戶端證書,如果指定為true,那么客戶端必須擁護服務器端可信任的證書后服務器才能響應客戶端;如果指定為false,那么服務器不需要驗證客戶端的證書。

    在此,我們又把PersonalTaxService部署一次,在server-config.wsdd中添加如下部署代碼。


    <service name="PersonalTaxService3" provider="java:RPC">
      <parameter name="allowedMethods" value="*"/>
      <parameter name="className" value="com.hellking.study.webservice.PersonalTaxService"/>
      </service>
     


    最后我們需要修改客戶端調用程序,如例程12所示。


    例程12 SSL客戶端調用程序

    package com.hellking.study.webservice;
    ….
    public class SSLAuthClient
    {
        static    final double salary=5000;
        public static void main(String [] args)
        {
            try {
                //服務端的url,注意使用了SSL協(xié)議后,前綴是https。
               String endpointURL = "https://localhost:8443/axis/services/PersonalTaxService3?wsdl";
               ….
                //由于使用了證書數(shù)字證書,所以不使用用戶名和密碼驗證。
    //call.getMessageContext().setUsername("hellking");。
                //call.getMessageContext().setPassword("simplewebservices");
               ….
                Double ret = (Double) call.invoke( new Object [] { new Double(salary) });
                System.out.println("使用SSL協(xié)議來作為Web服務的傳輸協(xié)議!");       
                 System.out.println("已經成功調用。請參看服務端的輸出!");
                 System.out.println("輸入工資"+salary+"元,應交個人所得稅:"+ret);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
     


    最后使用一下的命令來執(zhí)行客戶端程序:


    set AXIS_LIB=K:\jakarta-tomcat-5.0.16\webapps\axis\WEB-INF\lib
    SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j.jar.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%
    \saaj.jar;%AXIS_LIB%\commons-discovery.jar;%AXIS_LIB%\commons-logging.jar
    java -Djavax.net.ssl.keyStore=client.keystore \
    -Djavax.net.ssl.keyStorePassword=changeit \
    -Djavax.net.ssl.trustStore=client.truststore \
    com.hellking.study.webservice.SSLAuthClient
     


    參數(shù)解釋:通過-Djavax.net.ssl.keyStore來指定客戶端密匙庫,-Djavax.net.ssl.trustStore來指定客戶端信任庫。

    最后的輸出結果如下:


    使用SSL協(xié)議來作為Web服務的傳輸協(xié)議!
    已經成功調用。請參看服務端的輸出!
    輸入工資5000.0元,應交個人所得稅:445.0
    posted on 2007-11-24 15:00 禮物 閱讀(884) 評論(0)  編輯  收藏 所屬分類: webservice
    主站蜘蛛池模板: 亚洲日韩精品无码一区二区三区| 国色精品va在线观看免费视频| 亚洲精品国产成人99久久| 免费国产a国产片高清| 免费不卡视频一卡二卡| 国产精品区免费视频| 日产久久强奸免费的看| 亚洲熟妇无码av另类vr影视| 亚洲第一永久在线观看| 久久国产精品亚洲综合| 亚洲色精品aⅴ一区区三区| 国产gav成人免费播放视频| 四虎成人精品一区二区免费网站| 免费h片在线观看网址最新| 午夜无码A级毛片免费视频| 国产精品免费观看视频| 成人精品综合免费视频| 极品色天使在线婷婷天堂亚洲| 亚洲中文无码永久免| 亚洲免费人成视频观看| 久久亚洲AV无码精品色午夜| 亚洲第一精品在线视频| 亚洲网站在线观看| 亚洲国产精品婷婷久久| 亚洲AV无码不卡无码| 亚洲av综合色区| 无码欧精品亚洲日韩一区| 亚洲AV无码乱码在线观看富二代| 亚洲成Av人片乱码色午夜| 久久亚洲精品成人| 久久久婷婷五月亚洲97号色| 久久久亚洲AV波多野结衣| 亚洲黄色网址大全| 亚洲中文字幕人成乱码 | 亚洲av无码一区二区三区天堂| 亚洲一级大黄大色毛片| 国产成人精品亚洲日本在线| 亚洲国产成人久久精品app| 亚洲高清中文字幕免费| 亚洲日本va一区二区三区| 精品国产日韩亚洲一区在线|