服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

揭开weblogic web服务安全性的面纱

  安全性是我们大多数客户优先考虑的问题。随着越来越多的客户采用web服务,他们发现,他们需要了解如何保护web服务,以及使用何种身份验证机制。为了保持web服务的开放性并支持多种客户端类型,就必须了解如何处理web服务的安全性问题。

  本文深入幕后探讨了weblogic web服务的安全性问题。我将阐明如何保护weblogic web服务,身份验证如何工作,以及如何使用各种编程语言开发客户端来为weblogic web服务提供身份验证。

  weblogic web 服务组件

  以weblogic server作为宿主的web服务是使用标准的j2ee组件(比如ejb和jms)来实现的,并且作为标准的j2ee企业应用程序来打包。weblogic web服务使用简单对象访问协议(simple object access protocol ,soap)1.1作为消息格式,并使用http 1.1作为连接协议。

  web服务运行时组件是一组创建web服务所需的servlet和相关的基础架构。运行时的元素之一是一组用于处理来自客户端soa请求的servlet。这些servlet包含在weblogic server发布中。运行时的另一个元素是ant任务,它负责生成和组装weblogic web服务的所有组件。

  weblogic web服务作为标准的j2ee企业应用程序来打包,它由以下特殊组件组成:

  • 一个web应用程序至少包含一个servlet,用于发送soap消息给客户端和接收来自客户端的soap消息。它作为web服务开发过程的一部分而自动被包括在内。
  • 一个无状态会话ejb,用于为消息风格的web服务实现rpc风格的web服务或jms监听程序(比如消息驱动bean)。

  在一个rpc风格的web服务中,无状态会话ejb可以完成web服务的所有实际工作,或者它们可以把工作分配给其他ejb。web服务的实现者决定哪些ejb完成实际工作。在消息风格的web服务中,j2ee对象(通常是消息驱动bean)从jms目的地获取消息,并且处理它们。weblogic web服务作为企业存档(.ear)文件打包,其中包含web应用程序的web存档(.war)文件和ejb存档(.jar)文件。

  保护weblogic web 服务

  因为weblogic web服务作为标准的j2ee企业应用程序打包,所以通过保护组成web服务的以下标准j2ee组件中的一些或全部,来保护对web服务的访问:

  • soap servlet
  • rpc风格的web服务基于无状态会话ejb。可使用基本的http身份验证或ssl对尝试访问weblogic web服务的客户端进行身份验证。因为前述组件均为标准的j2ee组件,因此可以使用标准的j2ee安全过程来保护它们。

  保护消息风格的web服务

  可以通过保护负责处理客户端和服务之间soap消息的soap servlet,来保护消息风格的web服务。

  不论是手动还是使用wsgen ant任务来组装web服务时,您都可以在web应用程序的web.xml文件中引用soap servlet。这些servelet负责处理在weblogic server和客户端应用程序之间传递的soa消息。它们始终部署在weblogic server上,并为所有部署的weblogic web服务所共享。

  web服务引用哪个特定soap servlet取决于它的类型(rpc风格还是消息风格)。下面列出了对每个soap servlet的描述:

  • weblogic.soap.server.servlet.destinationsendadapter: 在负责接收来自客户端应用程序的数据并把这些数据发送给jms目的地的消息风格的web服务中处理soap消息。
  • weblogic.soap.server.servlet.queuereceiveadapter: 在负责把数据从jms队列发送给客户端应用程序的消息风格的web服务中处理soap消息。
  • weblogic.soap.server.servlet.topicreceiveadapter: 在负责把数据从jms主题发送给客户端应用程序的消息风格的web服务中处理soap消息。
  • weblogic.soap.server.servlet.statelessbeanadapter: 处理rpc风格的web服务和客户端应用程序之间的soap消息。
    例如,在客户端应用程序用来发送数据给jms目的地的消息风格的web服务中,负责处理soap消息的soap servlet是weblogic.soap.server.servlet.destinationsendadapter。用于组装web服务的wsgen ant任务把清单1中所示的元素添加到web应用程序的web.xml部署描述器。
   清单1
<servlet> <servlet-name>sender</servlet-name> <servlet-class> weblogic.soap.server.servlet.destinationsendadapter </servlet-class> <init-param> <param-name>topic-resource-ref</param-name> <param-value>senderdestination</param-value> </init-param> <init-param> <param-name>connection-factory-resource-ref</param-name> <param-value>senderfactory</param-value> </init-param> </servlet> ...

   为了限制对destinationsendadapter soap servlet的访问,您首先定义一个角色,并把它映射到安全域中的一个或多个主体,然后通过把web-resources-collection元素中的如下url-pattern元素添加到web应用程序的web.xml部署描述器,指定把该安全约束应用到该soap servlet。

  <url-pattern>/sendmsg</url-pattern>

  保护rpc风格的web服务

  您可以限制对rpc风格的web服务的访问,具体方法是限制对实现web服务或soap servlet的无状态会话ejb的访问。清单2和3显示了如何设置web.xml和weblogic.xml文件以保护soap servlet。确保客户端仍然能够访问wsdl文件。为了确保这一点,应避免使用通配符映射;而是显式地保护soap servlet适配器路径。这两个清单提供了一个如何保护帐户管理程序代理web服务的例子。正如您所看到的那样,角色是在web.xml中定义的,并与域中的组相关联。

  清单2  <security-constraint>  <web-resource-collection>  <web-resource-name> weather</web-resource-name>  <url-pattern>/weatherturi/*</url-pattern>  </web-resource-collection>  <auth-constraint>  <role-name>admin</role-name>  </auth-constraint>  </security-constraint>  <login-config>  <auth-method>basic</auth-method>  </login-config>  <security-role>  <role-name>admin</role-name>  </security-role>
  清单3  <security-role-assignment>  <role-name>admin</role-name>  <principal-name>system</principal-name>  </security-role-assignment>

  web 服务客户端

  为了理解如何处理web服务客户端的安全性问题,必须要理解soap和http身份验证的工作方式。

  soap身份验证

  web服务使用soap协议,它是以一些底层传输机制为基础而实现的高级消息传送协议。web服务安全性仍然是一个新兴领域,围绕soap规范出现了一些扩展,以支持安全功能。当前,soap使用的是针对身份验证的底层传输协议基础架构。所以,weblogic server soap间接地使用了http 1.1身份验证。

  http身份验证

  使用http的用户身份验证方法十分简单。因为http是一个无状态协议--也就是说,一旦请求完成之后,服务器不会记住关于该请求的任何信息--浏览器需要为每个请求重新发送用户名和密码(参见图1)。

揭开weblogic web服务安全性的面纱


图1

  第一次访问需验证的资源时,服务器将返回401状态(“unauthorized”),并包括一个www身份验证的响应头,用于指明所使用的域名和身份验证模式。然后,浏览器应该要求用户输入用户名和密码。接着,它再次请求同样的资源,这次包括了一个含有模式名(“basic”)的身份验证头,以及输入的用户名和密码。服务器检查此用户名和密码,如果它们是有效的,就会返回相应的页面。如果密码对于该用户无效,或者用户没有访问权限,服务器还会像以前一样返回401状态。然后,浏览器可以要求用户尝试重新输入用户名和密码。

  假定用户名和密码有效,接下来用户可能会请求一个受保护的资源。在这种情况下,服务器将使用401状态作为响应,而浏览器能够使用用户和密码详细信息再次发送请求。这样做会很慢,然而对于随后的请求,浏览器就会改为发送身份验证头。要了解http身份验证方面的更多信息,请参考w3c http working group rfc 2617 (www.w3c.org/protocols/specs.html)。

  客户端类型

  虽然前面的部分着重于浏览器客户端,但是协议对于任何类型的客户端都是相同的。任何需要访问受保护的web服务的客户端都要理解这个http身份验证协议,并实现它以求通过身份验证。这个部分说明了如何传送来自各种类型客户端的身份验证信息。

  ms visual basic 客户端

  microsoft为传输层提供httpconnector接口。它使用两个属性来传递证书--authuser 和authpassword。清单4显示了一个使用visual basic和ms soap toolkit 2.0调用一个受保护的weblogic web服务的例子。

  清单4  set client = new soapclient   client.mssoapinit  "<wsdl url>", "<service name in wsdl>", "<port name in wsdl>"  connect  client.connectorproperty("authuser") = <username>  client.connectorproperty("authpassword") = <password>  client.<service(args)>

  不应该把authuser 和authpassword与proxyuser 和proxypassword相互混淆。它们用于为代理服务器提供证书(如果存在证书的话)。这种身份验证的工作方式是一样的,除了返回的错误号是407,而不是401。

  java客户端

  weblogic server提供java客户端库来访问受保护的资源。用户名和证书是使用"java.naming.security.principal"和 "java.naming.security.credentials"来传送的。清单5描述了java客户端如何使用webserviceproxy来调用一个受保护的weblogic web服务。

  清单5  properties h = new properties();  h.put(context.initial_context_factory,  "weblogic.soap.http.soapinitialcontextfactory");  h.put("java.naming.security.principal", "<username>" );  h.put("java.naming.security.credentials", "<password>" );  context context = new initialcontext(h);  webserviceproxy proxy = (webserviceproxy)context.lookup(<wsdl_url>);  soapmethod method = proxy.getmethod("<method name>");  method.invoke(new object[]{"<args>"});

  jax-rpc客户端

  jax-rpc(java api for xml-based remote procedure calls,用于基于xml的远程过程调用的java api)是2002年6月发布的新标准,它定义了用于调用web服务的api。weblogic server 7.0 支持 jax-rpc。jax-rpc接口"stub"和 "call"均支持属性”javax.xml.rpc.security.auth.username" 和 "javax.xml.rpc.security.auth.password",身份验证信息就是借助这两个属性进行传送的。您还可以使用静态常量stub.username_property 和stub.password_property在调用服务之前设置安全性信息(参见清单6)。还可以在使用get<web service>port()获得端口的同时传送用户名和密码。

  清单6  <web service stub>._setproperty(stub.username_property, "<username>");  <web service stub>._setproperty(stub.password_property, "<password>");

  ms c++ 客户端

  类似地,您可以使用厂商提供的api编写c/c++客户端。ms soap工具包可以用于编写windows平台上的c++客户端。用户名和密码是使用connector property进行传送的。下面是一个设置用户名和密码的例子。

  connector->property["authuser"] =  "<username>";  connector->property["authpassword"] =  "<password>";

  结束语

  本文讨论了用于weblogic web服务和保护web服务组件的身份验证。因为web服务是涉及到不同技术的异构环境的自然选择,必须了解如何使用各种类型的客户端访问受保护的web服务。

扫描关注微信公众号