
使用 DataSnap 的数据库 Web 服务续篇
热 荐
【字体:小 大】
使用 DataSnap 的数据库 Web 服务续篇
作者:- 文章来源:- 点击数:806 更新时间:2006-4-22 
Bob Swart
Bob Swart Training & Consultancy
2003 年 8 月 本文显示了如何使用特殊的 Login 方法向 DataSnap 应用程序添加认证;指出了这一认证与 SSL 证书相结合用于提高安全性的重要性;以及描述了如何向 Web 服务器机器部署 DataSnap 服务器应用程序。
简介
几个月前,我写了有关将 IBM DB2 ®Universal Database ™用作分布式应用程序中后端数据库的两篇文章,其中把最初的 Windows 应用程序拆成了不相同的两层:瘦客户机层和数据库服务器层。 第一篇文章使用 Delphi ™7 的 DataSnap ™作为多层体系结构,而 第二篇文章添加了 SOAP 作为通信协议,从而最终形成了可用于 Windows(使用 Delphi 和 C++Builder ®)和 Linux(Kylix ™Delphi 版和 Kylix ™C++ 版)的解决方案。
我收到了关于这两篇文章的大量反馈,主要涉及部署问题,所以我想在这篇后续文章中解决这些问题,同时扩展 DataSnap SOAP 示例。除了讲述部署的步骤之外,我还要讨论一些登录和认证方面的细节,它们可能有助于提高 DB2 后端数据库的安全性。不过我们首先讨论后一主题。
添加少许安全性
在上两篇文章中,我展示了 DataSnap 客户机可以连接至 DataSnap 服务器并执行各种操作,如检索记录、更新记录、甚至删除记录,所有这些操作都不需要确认或认证。这适用于演示,但不适用于实际情况,所以这次将对 DataSnap 服务器和客户机添加较简单的安全性层(从而使您可以着手在这层周围构建甚至更为复杂的安全性层)。
TSQLConnection 组件是唯一直接与 DB2 数据库相连接的组件,TSQLConnection 组件已包含要连接至这个数据库所需的正确的用户名和密码,我已经用这样的方式(使用 TSQLConnection 组件)构建了 DataSnap 服务器。这意味着决不需要“在线路上”传递数据库用户名和密码,因而是安全的(除非有人“黑掉”了 Web 服务器并研究了 DataSnap 服务器的可执行文件,查找到用户名和密码特性)。您不需要在因特网上发送数据库用户名和密码,而应该在线路上发送特殊的“客户机”密码(禁用单个客户机比禁用数据库用户名/密码容易且影响也小)。
在很多地方 DataSnap 服务器都可以请求这样的认证,尤其是 TDataSetProvider 组件的 OnBefore 事件处理程序。这是一个组件,它实际上将来自服务器的数据(记录)发送给客户机,或根据从客户机接收到的信息来更新 DB2 表。您可以使用 OnBefore 事件处理程序来检查是否允许客户机请求记录或更新信息。
接着,您需要使用 OnBeforeGetRecords 和 OnBeforeApplyUpdates 事件处理程序“保护”服务器(使用前者请求记录,再使用后者修改服务器上的记录)。这两个事件处理程序都包含一个 OleVariant 类型的 OwnerData 参数。客户机应用程序可以在对应的 TClientDataSet 组件的 OnBefore 事件处理程序的参数中传递定制的“OwnerData”值。假定客户机应用程序已经允许最终用户输入用户名/密码,那么下面这段代码显示了 TClientDataSet 的 OnBeforeGetRecords 事件处理程序(客户机端):
procedure TForm1.ClientDataSet1BeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin OwnerData := CodeWord; end;
