根据 RFC2617 的规定,HTTP 有两种标准的认证方式,即,BASIC 和 DIGEST。HTTP Basic Authentication 是指客户端必须使用用户名和密码在一个指定的域 (Realm) 中获取认证。
正如"HTTP Basic Authentication"这个名字,它是 Authentication( 认证 ) 中最简单的方法。长期以来,这种认证方法被广泛的使用。当你通过 HTTP 协议去访问一个使用 Basic Authentication 保护的资源时,服务器通常会在 HTTP 请求的 Response 中加入一个"401 需要身份验证"的 Header,来通知客户提供用户凭证,以使用资源。如果你正在使用 Internet Explorer 或者 Mozilla Firefox 这样的可视化浏览器来访问需要认证的资源,浏览器会弹出一个窗口,让你输入用户名和密码,如果所输入的用户名在资源使用者的验证列表,并且密码完全正确,此时,用户才可以访问受限的资源。
HTTP BASIC 认证的基本流程如图 1 所示,
HTTP Basic Authentication 是指客户端在使用 HTTP 协议访问受限资源时,必须使用用户名和密码在一个指定的域 (Realm) 中获取认证。在正式开始之前,我们需要明白以下名词的含义:
本文将介绍如何使用 HTTP BASIC Authentication 来保护 Web services endpoint 服务资源,当 Web services 的 Endpoints 被设置为 BASIC HTTP 认证才能访问的受限资源时,用户必须提供用户名密码才能使用它们,基本的流程如图 2 所示。
<!-- Web services invoker role --> <role rolename="WsInvokerRole"/> <!-- Web services invokers/users --> <user username="wsaxis" password="wsaxis" roles="WsInvokerRole"/>
<!-- configurations for BASIC Authentication --> <security-constraint> <web-resource-collection> <web-resource-name>All Web services Endpoints</web-resource-name> <url-pattern>/services/*</url-pattern> </web-resource-collection> <auth-constraint> <description>Web services invokers are allowed doing invocation</description> <role-name>WsInvokerRole</role-name> </auth-constraint> </security-constraint> <!-- authentication method --> <login-config> <auth-method>BASIC</auth-method> <realm-name>Realm of Web services Invokers</realm-name> </login-config>
在“<security-constraint>”片段内,定义了改 Web Application 需要保护的资源,可以通过“<url-pattern>”来定义符合一定 URL 样式的资源,上述片段的定义,保护了所有 Web services 的 endpoints。
“<login-config>”片段定义了采取 BASIC 认证方式,其中“<realm-name>”只在 BASIC 认证方式下有效,它分配安全领域名,此名称供浏览器用于对话框标题,且为 Authorization 头部的一部分。
package sample.test.client.runable; import java.net.URL; import sample.test.ServiceImplServiceLocator; import sample.test.ServiceImplSoapBindingStub; public class StaticClientTest { public static void main(String[] args) { try { // String userName = "wsaxis", password = "wsaxis"; int addend = 64, augend = 128; ServiceImplSoapBindingStub sisbs = new ServiceImplSoapBindingStub( new URL( "http://localhost:8080/TomcatAxis/services/ServiceImpl"), new ServiceImplServiceLocator()); // sisbs.setUsername(userName); // sisbs.setPassword(password); System.out .println("Static Client Invocation:\n\tThe summation is: " + sisbs.sum(addend, augend)); } catch (Exception e) { e.printStackTrace(); } } }
package sample.test.client.runable; import javax.xml.namespace.QName; import javax.xml.rpc.Call; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.Service; import javax.xml.rpc.ServiceFactory; public class DynamicClientTest { public static void main(String[] args) { try { String address = "http://localhost:8080/TomcatAxis/services/ServiceImpl"; String namespaceURI = "http://test.sample"; String serviceName = "ServiceImplService"; String portName = "ServiceImpl"; String operationName = "sum"; String userName = "wsaxis", password = "wsaxis"; int addend = 64, augend = 128; ServiceFactory factory = ServiceFactory.newInstance(); Service service = factory.createService(new QName(serviceName)); Call call = service.createCall(new QName(portName)); call.setTargetEndpointAddress(address); QName intQName = new QName("http://www.w3.org/2001/XMLSchema","int"); call.setOperationName(new QName(namespaceURI, operationName)); call.addParameter("addend", intQName, ParameterMode.IN); call.addParameter("augend", intQName, ParameterMode.IN); call.setReturnType(intQName); call.setProperty(Call.USERNAME_PROPERTY, userName); call.setProperty(Call.PASSWORD_PROPERTY, password); Object[] inParams = new Object[2]; inParams[0] = new Integer(addend); inParams[1] = new Integer(augend); int value = ((Integer) call.invoke(inParams)).intValue(); System.out.println("Dynamic Client Invocation:\n\tThe summation is: " + value); } catch (Exception e) { e.printStackTrace(); } } }
Web services 安全 - HTTP Basic Authentication
原文:http://www.cnblogs.com/silva/p/6010634.html