首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

CXF密码应验_服务端和客户端配置

2012-11-06 
CXF密码验证_服务端和客户端配置CXF密码认证是在我前面的一篇文章WebService CXF+struts+spring 示例?的基

CXF密码验证_服务端和客户端配置

CXF密码认证是在我前面的一篇文章WebService CXF+struts+spring 示例?的基础上写的.如果你感觉看不懂这篇.那就先看看前面的那篇文章吧!

1:spring服务端的配置

  <bean id="Customer"  implementor="#Customer"   address="/web" >   <jaxws:inInterceptors>              <bean />              <bean />              <bean value="UsernameToken" />                          <entry key="passwordType"                              value="PasswordText" />                          <entry key="user" value="cxfServer" />                          <entry key="passwordCallbackRef">                              <ref bean="serverPasswordCallback" />                          </entry>                      </map>                  </constructor-arg>              </bean>          </jaxws:inInterceptors>     </jaxws:endpoint><bean id="serverPasswordCallback"  />  

?

action:UsernameToken是使用用户令牌

passwordType:PasswordText是指密码加密策略.这里是直接密码文本.

user:cxfServer是指别名

passwordCallbackRef:serverPasswordCallback是这密码验证..类..就是下面配置的..

2: 类:serverPasswordCallback

?

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 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("密码是:"+pw);System.out.println("类型是:"+idf);if(pw.equals("wdwsb")&&idf.equals("admin")){System.out.println("成功");}else{throw new SecurityException("验证失败");}}

?这个不用多说..就是密码验证..很简单!!

3:spring客户端的配置:

?

<bean id="webTest" factory-bean="client" factory-method="create"/> <bean id="client" > <property name="address" value="http://127.0.0.1:88/Hello/web/web"></property> <property name="serviceClass" value="org.web.HelloService"></property> <property name="outInterceptors"> <list><bean />              <bean />              <bean value="UsernameToken" />                          <entry key="passwordType"                              value="PasswordText" />                          <entry key="user" value="cxfClient" />                          <entry key="passwordCallbackRef">                              <ref bean="clientPasswordCallback" />                          </entry>                      </map>                  </constructor-arg>              </bean>   </list></property> </bean> <bean id="clientPasswordCallback" name="code">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 clientPasswordCallback implements CallbackHandler {public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackException {for(int i=0;i<callbacks.length;i++){WSPasswordCallback ps=(WSPasswordCallback) callbacks[i];ps.setPassword("wdwsb");ps.setIdentifier("admin");}}

??到此为止..密码认证用户令牌就完成了...

测试!

?

通过!

?

当然我前面写的一篇文章是最基本的.缺少了一些jar包.会报错的.

所以要加上以下jar包..

?

CXF密码应验_服务端和客户端配置

?

?

?

ps.setPassword("wdwsb"); ps.setIdentifier("admin");

如果 我希望是填入当前登陆用户的用户名,密码,怎么办呢?WSPasswordCallback pwCb = new WSPasswordCallback(user, null, pwType, 2, data); try { data.getCallbackHandler().handle(new Callback[] { pwCb }); }
也就是说,在这里要设置password,然后
if (passwordsAreEncoded)passDigest = UsernameToken.doPasswordDigest(nonce, createdTime, Base64.decode(origPassword));else { passDigest = UsernameToken.doPasswordDigest(nonce, createdTime, origPassword);}if (!(passDigest.equals(password))) {throw new WSSecurityException(5);}

在这里比两个密码是否一致,之后的操作由框架完成所以
serverPasswordCallback要做的是setPassword,而不是在这里比较.
apache-cxf-2.4.0 WSPasswordCallback pwCb = new WSPasswordCallback(user, null, pwType, 2, data); try { data.getCallbackHandler().handle(new Callback[] { pwCb }); }
也就是说,在这里要设置password,然后
if (passwordsAreEncoded)passDigest = UsernameToken.doPasswordDigest(nonce, createdTime, Base64.decode(origPassword));else { passDigest = UsernameToken.doPasswordDigest(nonce, createdTime, origPassword);}if (!(passDigest.equals(password))) {throw new WSSecurityException(5);}

在这里比两个密码是否一致,之后的操作由框架完成所以
serverPasswordCallback要做的是setPassword,而不是在这里比较.
apache-cxf-2.4.0
ps.setPassword("wdwsb"); ps.setIdentifier("admin");

如果 我希望是填入当前登陆用户的用户名,密码,怎么办呢?



可以设置变量,传值啊.应该不难.

热点排行