web service訪問控制和過濾器(axis)

使用axis的Handler進行訪問控制

axis爲Web服務的訪問控制提供了相關的配置描述符,並且提供了一個訪問控制的簡單Handler(關於Handler的詳細介紹見" J2EE Web服務開發系列之六: 使用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");//密碼
。。。
 


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

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

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


圖1 過濾器工作原理
 

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

將要開發的過濾器將根據客戶端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
             {
                 //驗證成功,繼續處理
               chain.doFilter(req,res);            

             }     
            
    }   
    …
}
 


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

除了編寫Servlet過濾器實現類外,還需要在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中,那麼就不能訪問目標服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章