XFire webservice WS-Security安全

 XFire是codeHaus組織提供的一個開源框架,它構建了POJO和SOA之間的橋樑,主要特性就是支持將POJO通過非常簡單的方式發佈成Web服務,這種處理方式不僅充分發揮了POJO的作用,簡化了Java應用轉化爲Web服務的步驟和過程,也直接降低了SOA的實現難度,用過xfire的朋友一定會這樣的感觸,對於xfire的基本配置及調用方式已經很多的相關文章,這裏主要對xfire的權限管理的實現做一下詳細的講解。

       Xfire採用了WSS4J作爲Web Services Security (WS-Security)的實現,WSS4J是一java的jar包,它可以用來在發佈服務時標記訪問密碼和在調用時驗證密碼。這個包的下載地址爲http://www.apache.org/dyn/closer.cgi/ws/wss4j/

       在使用WS-Security之前我們需要安裝一個jdk的加密處理包(Unlimited Strength Jurisdiction Policy Files),下載地址爲http://java.sun.com/j2se/1.5.0/download.jsp(不太顯眼,在下面),下載後的文件名爲jce_policy-1_5_0.zip,解壓后里面有兩個jar文件,分別爲local_policy.jar和US_export_policy.jar,把這兩個文件放到java_home/jre/lib/security目錄下覆蓋原來的文件。還需要安裝一個bcprov-jdk15-141.jar,下載地址爲http://BouncyCastle.org,下載後放到java_home/jre/lib/ext目錄下。這兩個包都是必須的。

       好了,以上是準備工作,下面我們就開爲服務設置訪問權限吧!

      

       1.先寫一個類叫PasswordHandler,代碼如下

package org.codehaus.xfire.demo;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

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 PasswordHandler implements CallbackHandler {

     private Map passwords = new HashMap();
     public PasswordHandler() {
          passwords.put("user1", "pwd1");
          passwords.put("user2", "pwd2");
     }
     public void handle(Callback[] callbacks) throws IOException,
              UnsupportedCallbackException {
 
          WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
          String id = pc.getIdentifer();
          pc.setPassword((String) passwords.get(id));
    }
}

        其中user1,user2表示可以提供多個用戶名密碼,調用時任選一個。

     2.在services.xml配置中加入如下代碼:

<service>
  <name>BookServiceUTHP</name>
  <namespace>http://xfire.codehaus.org/BookService</namespace>
  <serviceClass>example.webservice.service.BookService</serviceClass>
  <inHandlers>
   <handler handlerClass="org.codehaus.xfire.util.dom.DOMInHandler" />
   <bean class="org.codehaus.xfire.security.wss4j.WSS4JInHandler" xmlns="">
    <property name="properties">
     <props>
      <prop key="action">UsernameToken</prop>
      <prop key="passwordCallbackClass">
       org.codehaus.xfire.demoPasswordHandler
      </prop>
     </props>
    </property>
   </bean>

  </inHandlers>
 </service>

 其中紅色部分的org.codehaus.xfire.demoPasswordHandler   就是我們剛纔上面寫的那個類,這樣別人在調服務的時候就會調用那個類來驗證密碼,密碼的傳輸的過程會使用安裝的那兩個包進行加密和解密。OK,發佈完成了。

    3.服務的調用,寫一個main方法下面加入

Service serviceModel = new ObjectServiceFactory().create(IBook.class);//接口類
  Object service = new XFireProxyFactory().create(serviceModel, getUrl()
    + getServiceName());
   Client client = ((XFireProxy) Proxy.getInvocationHandler(service)).getClient();
   client.addOutHandler(new DOMOutHandler());
   Properties properties = new Properties();
   properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
   properties.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST);
   client.addOutHandler(new WSS4JOutHandler(properties));
   client.setProperty(WSHandlerConstants.USER,"user1");
   client.setProperty(WSHandlerConstants.PW_CALLBACK_REF,new PasswordHandler("pwd1"));//PasswordHandler是客戶端的處理密碼的類,代碼如下


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 PasswordHandler implements CallbackHandler {

 String password ;

 public PasswordHandler(String password) {
  this.password = password;
 }

 public void handle(Callback[] callbacks) throws IOException,
   UnsupportedCallbackException {
 
  WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
  pc.setPassword(password);

 }

}

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/enxiuwang/archive/2009/03/17/3997757.aspx

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