在按照網上的例子進行配置用戶名令牌的例子,在server端的回調函數中獲取的password 卻一直是空,搜索了好半天,才找到(這個是MD5加密的):java
WSPasswordCallback 的passwordType屬性和password 屬性都爲null,你只能得到用戶名(identifier),通常這裏的邏輯是使用這個用戶名到數據庫中查詢其密碼,而後再設置到password 屬性,WSS4J 會自動比較客戶端傳來的值和你設置的這個值。你可能會問爲何這裏CXF 不把客戶端提交的密碼傳入讓咱們在ServerPasswordCallbackHandler 中比較呢?這是由於客戶端提交過來的密碼在SOAP 消息中已經被加密爲MD5 的字符串,若是咱們要在回調方法中做比較,那麼第一步要作的就是把服務端準備好的密碼加密爲MD5 字符串,因爲MD5 算法參數不一樣結果也會有差異,另外,這樣的工做CXF 替咱們完成不是更簡單嗎?web
根據上面說的,我獲取的password 爲null,因此這裏就不用本身判斷密碼了,只要驗證用戶名後,在設置密碼就能夠自動驗證了,代碼以下:算法
public class ServerPasswordCallback implements CallbackHandler { public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; String pw = pc.getPassword(); String idf = pc.getIdentifier(); System.out.println("password:"+pw); System.out.println("identifier:"+idf); if(idf.endsWith("admin")){ pc.setPassword("admin"); } } }
如下是源代碼:spring
HelloWorld.java數據庫
HelloWorldImpl.javaapache
ServerPasswordCallback.java服務器
ClientPasswordCallback .javaapp