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

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

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

    posts - 0, comments - 77, trackbacks - 0, articles - 356
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    XFire Web Service驗證方案

    Posted on 2008-03-03 11:26 semovy 閱讀(1150) 評論(0)  編輯  收藏 所屬分類: WebService
    XFire的文檔做的真是相當的爛,非常不詳細,看得匪夷所思,而且和發行的代碼版本相當的不匹配,里面的示例根本無法運行,看得真是……相當窩火

    公司項目XFire的服務框架我已經做好,這兩天就要加入驗證功能,而且要和整體權限框架(還沒做)相結合
    開始想通過HttpSession驗證,這樣可以很方便的和b/s的權限系統相統一,但實在不知道如何在客戶端通過Spring或XFire訪問HttpSession,XFire里的文檔倒是提到了:
    HttpServletRequest request = XFireServletController.getRequest();
    HttpServletResponse response = XFireServletController.getResponse();

    并且說只要在web.xml里配置XFireSpringServlet就可以,可是按照配了,結果還是不行
    注:axis好像是有MessageContext可以很方便的訪問到,xfire里也有MessageContext,可是getSession()出來的是null
    如果有高手知道如何做還望麻煩告知

    此條路不通只好去查XFire的文檔關于authentication部分,大概有以下幾種方案:
    1. HTTP Authentication
    2. SOAP Header authentication with JSR181
    3. SOAP authentication with handlers
    4. WS-Security
    其中第一條HTTP Authentication的文檔寫的相當匪夷所思,文檔寫到如何在客戶端指定用戶名和密碼
    // Create your client
    Client client = ....;

    // Or get it from your proxy
    Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient();

    client.setProperty(Channel.USERNAME, "username");
    client.setProperty(Channel.PASSWORD, "pass");

    去忘了寫服務端應該怎么做,這個username和password該在那里驗證呢??我翻遍了文檔也沒找著


    來看第二條SOAP header authentication with JSR181,看起來倒是很簡單

    但是在Service的代碼中每個方法里都要寫一個UserToken驗證的參數,雖然似乎權限粒度能控制得很細,但是這嚴重污染了業務邏輯的代碼,非常的不優雅,放棄!


    public void someOperation(String data, @WebParam(header=true) UserToken token) {
    authenticate(token)

    // do your normal request here
    }

    再看WS-Security,這是webservice的安全標準,但實在太復雜了,并且需要配置Service.xml,我們項目是Java1.5,Service.xml根本就沒有寫,是自動生成的,我是實在找不到Service.xml該在那配置?只好作罷


    現在只剩下SOAP authentication with handlers,根據文檔來看這是能夠滿足我的要求的,不侵入業務邏輯,能夠和整體權限系統相結合,并且配置比較簡單
    把例子里的代碼拷過來,發現根本不能用,少了yom這個包,在網上找了很久也沒找到,后來發現yom其實就是yet(another) document object model,原來和dom是一回事嘛,用jdom替換,編譯通過。

    文檔里遺漏了很重要的一點,就是關于如何在xfire-servlet里配置,導致很多人看了文檔也進行不下去,我查了很久才在老外的一篇blog里找到一點tips,下面是配置:
        <!-- WebService base, do not modify it -->
        <bean id="webService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">
            <property name="serviceFactory">
                <ref bean="xfire.serviceFactory" />
            </property>
            <property name="xfire">
                <ref bean="xfire" />
            </property>
        </bean>

        <bean id="yourWebService" parent="webService">
            <property name="serviceBean">
                <ref bean="yourService" />
            </property>
            <property name="serviceClass">
                <value>your.package.YourServiceInterface</value>
            </property>
            <property name="inHandlers">
                <ref bean="authenticationHandler"/>
            </property>
        </bean>

    AuthenticationHandler需要修改一下,其他不用變:

    AuthenticationHandler.java

    import org.apache.log4j.Logger;
    import org.codehaus.xfire.MessageContext;
    import org.codehaus.xfire.handler.AbstractHandler;
    import org.codehaus.xfire.fault.*;
    import org.jdom.*;

    public class AuthenticationHandler extends AbstractHandler {
        private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
       
        public void invoke(MessageContext context) throws Exception {
            log.info("authentication handler is invoked");
            if (context.getInMessage().getHeader() == null)
            {
                throw new XFireFault("Request must include company authentication token.",
                                     XFireFault.SENDER);
            }
            Element header = context.getInMessage().getHeader();
            Element token = header.getChild("AuthenticationToken");
           
            if (token == null)
            {
                throw new XFireFault("Request must include authentication token.",
                                     XFireFault.SENDER);
            }

            String username = token.getChild("Username").getText();
            String password = token.getChild("Password").getText();

            try {
                // 現在你已經得到了客戶端傳來的username和password,那就驗證它吧(可以交給acegi來驗證)
                }

            }catch(Exception e) {
                log.warn(e);
                throw new XFireFault("Authentication Failed.",
                        XFireFault.SENDER);
            }
        }
    }

    客戶端代碼:

                Service serviceModel = new ObjectServiceFactory().create(YourService.class);
                YourService service = (YourService) new XFireProxyFactory().create(serviceModel,
                     "http://localhost:8080/YourProject/service/YourService");
                XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
                Client client = proxy.getClient();
                client.addOutHandler(new ClientAuthHandler("jeffrey", "killjava"));
                // 執行下面代碼會進行驗證
                service.someOperation();
    主站蜘蛛池模板: 美女露隐私全部免费直播| 亚洲欧美自偷自拍另类视| 免费视频成人国产精品网站| 国产美女在线精品免费观看| 中文字幕在线观看亚洲| 国产免费爽爽视频在线观看 | h视频在线观看免费完整版| 综合亚洲伊人午夜网| 中文字幕永久免费| 亚洲国产精品SSS在线观看AV| 精品一区二区三区高清免费观看| 亚洲国产小视频精品久久久三级| 天堂亚洲免费视频| 国产亚洲精AA在线观看SEE| 免费无码又爽又刺激网站| 亚洲国产女人aaa毛片在线| 免费无码VA一区二区三区| 亚洲精品中文字幕乱码影院 | 免费av欧美国产在钱| 亚洲一卡2卡三卡4卡无卡下载| 成年人视频在线观看免费| 精品久久久久久亚洲中文字幕 | 亚洲AV之男人的天堂| 国产精品成人69XXX免费视频| 亚洲精品无码永久中文字幕| 午夜免费啪视频在线观看| 亚洲国产精品白丝在线观看| 四虎永久在线精品免费观看视频| 亚洲综合色丁香婷婷六月图片| 国产高清免费的视频| 免费无码婬片aaa直播表情| 狠狠色伊人亚洲综合成人| 曰批全过程免费视频网址| 亚洲成av人片天堂网无码】| 免费国产a国产片高清网站| 好紧我太爽了视频免费国产| 亚洲av永久无码嘿嘿嘿| 亚洲免费在线观看| 亚洲一区二区三区免费在线观看| 亚洲AV电影天堂男人的天堂| 亚洲欧洲无码AV电影在线观看|