`
PKI_Gavin
  • 浏览: 21756 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一个简单的用户口令验证机制

    博客分类:
  • JAVA
阅读更多
1.修改WebService 服务端 spring 配置文件 ws-context.xml
Xml代码
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd" 
    default-autowire="byName" default-lazy-init="true"> 
      
    <jaxws:endpoint id="webServiceSample" 
        address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"> 
 
        <jaxws:inInterceptors> 
            <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" /> 
            <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> 
                <constructor-arg> 
                    <map> 
                        <entry key="action" value="UsernameToken" /> 
                        <entry key="passwordType" value="PasswordText" /> 
                        <entry key="passwordCallbackClass" value="cn.org.coral.biz.examples.webservice.handler.WsAuthHandler" /> 
                    </map> 
                </constructor-arg> 
            </bean> 
        </jaxws:inInterceptors>     
 
    </jaxws:endpoint> 
      
</beans> 



2.服务端添加passwordCallbackClass回调类,该类进行用户口令验证:
Java代码
package cn.org.coral.biz.examples.webservice.handler;

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

public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
if (pc.getIdentifer().equals("ws-client")){
if (!pc.getPassword().equals("admin")) {
throw new SecurityException("wrong password");
}
}else{
throw new SecurityException("wrong username");
}
}

}

package cn.org.coral.biz.examples.webservice.handler;

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

public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
if (pc.getIdentifer().equals("ws-client")){
if (!pc.getPassword().equals("admin")) {
throw new SecurityException("wrong password");
}
}else{
throw new SecurityException("wrong username");
}
}

}


3.客户端修改spring 配置文件 wsclient-context.xml 如下:
Xml代码
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd" 
    default-autowire="byName" default-lazy-init="true"> 
 
 
    <!-- ws clinet --> 
    <bean id="webServiceSampleClient" class="cn.org.coral.biz.examples.webservice.WebServiceSample" 
        factory-bean="webServiceSampleClientFactory" factory-method="create" /> 
 
 
    <bean id="webServiceSampleClientFactory" 
        class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> 
        <property name="serviceClass" 
            value="cn.org.coral.biz.examples.webservice.WebServiceSample" /> 
        <property name="address" 
            value="http://88.148.29.54:8080/aio/services/WebServiceSample" /> 
        <property name="outInterceptors"> 
            <list> 
                <bean 
                    class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" /> 
                <ref bean="wss4jOutConfiguration" /> 
            </list> 
        </property> 
    </bean> 
 
    <bean id="wss4jOutConfiguration" 
        class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> 
        <property name="properties"> 
            <map> 
                <entry key="action" value="UsernameToken" /> 
                <entry key="user" value="ws-client" /> 
                <entry key="passwordType" value="PasswordText" /> 
                <entry> 
                    <key> 
                        <value>passwordCallbackRef</value> 
                    </key> 
                    <ref bean="passwordCallback" /> 
                </entry> 
            </map> 
        </property> 
    </bean> 
    <bean id="passwordCallback" 
        class="cn.org.coral.biz.examples.webservice.handler.WsClinetAuthHandler"> 
    </bean> 
 
</beans> 

4.客户端添加passwordCallback类,通过该类设置访问口令
Java代码
package cn.org.coral.biz.examples.webservice.handler;

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


public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
int usage = pc.getUsage();


System.out.println("identifier: " + pc.getIdentifer());
System.out.println("usage: " + pc.getUsage());
if (usage == WSPasswordCallback.USERNAME_TOKEN) {
// username token pwd...
pc.setPassword("admin");

} else if (usage == WSPasswordCallback.SIGNATURE) {
// set the password for client's keystore.keyPassword
pc.setPassword("keyPassword");
}
}
}

}

package cn.org.coral.biz.examples.webservice.handler;

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


public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
int usage = pc.getUsage();


System.out.println("identifier: " + pc.getIdentifer());
System.out.println("usage: " + pc.getUsage());
if (usage == WSPasswordCallback.USERNAME_TOKEN) {
// username token pwd...
pc.setPassword("admin");

} else if (usage == WSPasswordCallback.SIGNATURE) {
// set the password for client's keystore.keyPassword
pc.setPassword("keyPassword");
}
}
}

}


5.junit单元测试程序:
Java代码
package cn.org.coral.biz.examples.webservice;

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.util.Assert;

public class TestWebService extends AbstractDependencyInjectionSpringContextTests {
WebServiceSample webServiceSampleClient;

@Override
protected String[] getConfigLocations() {
setAutowireMode(AUTOWIRE_BY_NAME);
return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
}

/**
* @param webServiceSampleClient the webServiceSampleClient to set
*/
public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
this.webServiceSampleClient = webServiceSampleClient;
}

public void testSay(){
String result = webServiceSampleClient.say(" world");
Assert.hasText(result);
}
}

package cn.org.coral.biz.examples.webservice;

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.util.Assert;

public class TestWebService extends AbstractDependencyInjectionSpringContextTests {
WebServiceSample webServiceSampleClient;

@Override
protected String[] getConfigLocations() {
setAutowireMode(AUTOWIRE_BY_NAME);
return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
}

/**
* @param webServiceSampleClient the webServiceSampleClient to set
*/
public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
this.webServiceSampleClient = webServiceSampleClient;
}

public void testSay(){
String result = webServiceSampleClient.say(" world");
Assert.hasText(result);
}
}
分享到:
评论
3 楼 sskhnje 2008-08-19  
我也期望你的回复,,,
2 楼 fireflylover 2008-06-18  
我也遇着同样问题,希望可以解答
1 楼 limaoyuan 2008-06-06  
完全按你的方式做的,抛出了下面的异常,是不是有什么冲突?
信息: Creating Service {http://demo.com/}HelloWorldService from class com.demo.HelloWorld
context: org.springframework.context.support.ClassPathXmlApplicationContext@1ffb8dc: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1ffb8dc]; startup date [Fri Jun 06 02:11:04 GMT 2008]; root of context hierarchy
2008-6-6 2:11:26 org.apache.cxf.phase.PhaseInterceptorChain doIntercept
信息: Interceptor has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: SOAPEXCEPTION
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:83)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:57)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:177)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)
Caused by: javax.xml.soap.SOAPException: Failed to create MessageFactory: org.apache.axis.soap.MessageFactoryImpl
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:55)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:71)
... 8 more
Caused by: java.lang.ClassNotFoundException: org.apache.axis.soap.MessageFactoryImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:50)
... 9 more
Exception in thread "main" javax.xml.ws.WebServiceException: Cannot create SAAJ factory instance.
at org.apache.cxf.jaxws.binding.soap.SOAPBindingImpl.getSOAPFactory(SOAPBindingImpl.java:118)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:193)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)
Caused by: javax.xml.soap.SOAPException: Failed to create SOAPConnectionFactory: org.apache.axis.soap.SOAPFactoryImpl
at javax.xml.soap.SOAPFactory.newInstance(SOAPFactory.java:46)
at org.apache.cxf.jaxws.binding.soap.SOAPBindingImpl.getSOAPFactory(SOAPBindingImpl.java:113)
... 3 more
Caused by: java.lang.ClassNotFoundException: org.apache.axis.soap.SOAPFactoryImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at javax.xml.soap.SOAPFactory.newInstance(SOAPFactory.java:41)
... 4 more






如果添加了axis包后会抛下面异常:
2008-6-6 2:07:55 org.apache.cxf.phase.PhaseInterceptorChain doIntercept
信息: Interceptor has thrown exception, unwinding now
org.w3c.dom.DOMException: No such Localname for SOAP URI
at org.apache.axis.message.SOAPDocumentImpl.createElementNS(SOAPDocumentImpl.java:379)
at org.apache.axis.SOAPPart.createElementNS(SOAPPart.java:1109)
at org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:98)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:95)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:76)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:57)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:177)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)
Exception in thread "main" java.lang.NoSuchMethodError: javax.xml.soap.SOAPFactory.createFault()Ljavax/xml/soap/SOAPFault;
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:193)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)


期待你的回复

相关推荐

    用户管理密码验证函数

    通过上述步骤,我们可以在Oracle数据库中实现基于自定义函数的密码验证机制。这种方式不仅可以根据实际需求灵活调整密码策略,还能够增强系统的安全性。需要注意的是,在实际部署过程中,还需要考虑更多细节问题,...

    Java登陆验证机制

    2. **主体(Subject)**:Subject代表了一个实体,它可以是用户、系统进程或者其他需要进行安全验证的对象。Subject包含Principals(表示身份)和Credentials(表示凭证)。当用户成功登录后,其Principals和...

    c语言编写的简单密码登录验证

    虽然此示例代码提供了一个简单的密码验证功能,但在实际应用中还需要考虑更多的安全措施: - **避免使用明文密码**:示例代码中直接使用明文密码进行比较,这在实际应用中是非常危险的。应当采用加密的方式存储和...

    为activemq服务器添加简单验证机制

    在这个配置中,我们添加了一个`&lt;plugins&gt;`元素,并在其内部定义了一个`&lt;authenticator&gt;`,使用`&lt;simple&gt;`标签来指定简单的用户名/密码验证。然后,在`&lt;users&gt;`标签内,我们可以列出允许连接的用户及其对应的密码。 ...

    实训24 用户注册登录和密码验证系统实训

    总结起来,这个实训项目涵盖了ASP编程、SQL Server数据库操作、用户认证、密码安全策略等多个重要知识点,对于理解Web应用程序的开发流程和安全机制有很好的实践价值。通过这个实训,学习者可以深入掌握用户管理系统...

    用户密码的合法化验证(异常类)

    例如,在Java中,一个简单的自定义异常类可能如下所示: ```java public class InvalidPasswordException extends Exception { private String errorMessage; public InvalidPasswordException(String message)...

    cas server 5.3.9 整合数据库验证用户信息,使用security密码验证方式

    总之,"cas server 5.3.9 整合数据库验证用户信息,使用security密码验证方式"意味着你正在构建一个利用CAS Server 5.3.9版本的单点登录系统,并结合Spring Security的密码验证功能,从数据库中获取和验证用户的身份...

    windows用户名和密码验证

    综上所述,使用VC编写一个验证Windows用户名和密码的对话框程序涉及到Windows API的使用、事件处理、用户界面设计以及安全性考虑等多个方面。通过理解和应用这些知识点,你可以创建出一个功能完备且安全的验证工具。

    php简单的cookie身份验证机制

    在PHP编程中,Cookie是一种常见的身份验证机制,用于在客户端(浏览器)和服务器之间...了解这些基础知识后,你可以根据提供的源代码学习和理解实际的实现细节,并可能进一步优化和增强这个简单的Cookie身份验证机制。

    Tomcat安全验证机制

    - **内部管理系统**:可以利用Tomcat的安全验证机制限制对内部管理系统的访问,只允许具有特定角色的用户登录。 - **用户权限管理**:通过定义不同的角色和用户,可以实现精细的权限控制,例如只允许特定用户查看...

    Qt 简单的登录验证

    在本文中,我们将深入探讨如何使用Qt库创建一个简单的登录验证系统。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面、移动和嵌入式设备。在这个项目中,我们关注的是使用Qt的LineEdit控件和...

    .NET 用户身份验证

    总之,.NET中的用户身份验证是一个涉及多方面知识的复杂主题,从选择合适的身份验证机制,到使用验证控件确保用户输入的有效性,再到确保整个过程的安全性,都需要开发者具备扎实的理论基础和实践经验。理解并熟练...

    CXF 通过用户名和密码进行验证

    2. **角色和权限**:除了基本的用户名密码验证外,还可以结合角色和权限系统,为不同的用户提供不同级别的访问权限。 3. **证书认证**:除了用户名和密码,也可以使用X.509证书进行双向认证,提供更高级别的安全性...

    java动态口令登录实现过程详解

    通过使用 ItsClient 对象和 SHA1 加密方法,可以实现动态口令登录的功能,并提供了一个安全的身份验证机制。 在动态口令登录的过程中,还需要注意一些安全问题。例如,需要确保动态口令的安全性,防止黑客攻击和...

    Vue+Flask实现简单的登录验证跳转的示例代码

    本示例代码展示了如何使用Vue和Flask实现一个简单的登录验证跳转功能,展示了前端和后端之间的交互过程,以及如何使用Session机制来存储用户信息。 知识点: * Vue框架的基本使用 * Flask框架的基本使用 * 模板...

    在yii中新增一个用户验证的方法详解

    在Yii框架中实现用户验证机制是一个重要的环节,它可以保护网站免受未经授权的访问,同时确保只有合法用户可以进行特定操作。在本篇详解中,我们将深入探讨在Yii框架中新增一个用户验证方法的过程,并且涵盖与用户...

    JQ验证密码强弱,超赞!

    通过上述方法,我们可以创建一个功能强大且用户体验良好的密码强度验证机制。在项目中应用这些技巧,不仅可以提升网站的安全性,还能为用户提供更好的交互体验。这个压缩包中的代码示例很可能是实现这一功能的实例,...

    SQL server SQL验证时创建用户过程

    SQL Server 是一个关系型数据库管理系统,它提供了多种身份验证机制来确保数据库的安全性。其中,SQL Server 验证是一种常用的身份验证方式,通过创建用户过程来实现身份验证。本文将详细介绍 SQL Server SQL 验证时...

    PHP下几种用户身份验证方式初探.pdf

    TOKEN 是一种基于加密算法的验证机制,可以生成一个令牌,用于验证用户的身份。 4. 结论 用户身份验证是 PHP 开发中一个非常重要的安全问题,本文对 PHP 下几种用户身份验证方式进行了探讨,分析了每种方式的优...

Global site tag (gtag.js) - Google Analytics