使用Delphi XE使用Datasnap构建一个相对简单的数据库应用程序.
由于我的应用程序中的某些安全性是在数据库级别处理的,因此我需要将用户的SQL凭据从我的客户端应用程序传递到我的Datasnap服务器.
(我想尽可能使Datasnap服务器无状态,所以要认识到每次调用我都必须这样做.)
我在客户端使用ClientDatasets(CDS),因此我可以使用OnBeforeGetRecords将OwnerData OleVariant中的数据从客户端上的CDS传递到服务器上相应的TDataSetProvider.但这意味着每个数据模块上的每个CDS都必须有一个事件来执行此操作,这看起来很麻烦且不实用.我不禁感到必须有一种方法将消息传递给服务器,而不是更高级别.
在服务器端的DSServerClass级别,我真正喜欢的是这样的:
Procedure TMyServerContainer.MyServerClassCreateInstance(DSCreateInstanceEventObject: TDSCreateInstanceEventObject);
begin
// Server detects request for data from client app
fUsername := GetUsernameFromClientSomehow;
fPassword := GetPasswordFromClientSomehow;
// create data modules and initialise
MyDataModule := TMyDataModule.Create(nil);
MyDataModule.InitialiseWithSQLCredentials(fUsername, fPassword);
DSCreateInstanceEventObject.ServerClassInstance := MyDataModule;
End;
Run Code Online (Sandbox Code Playgroud)
Authentication Manager组件可以帮助我吗?还有其他想法吗?还是我坚持使用OnBeforeGetRecords?
非常感谢.
您可以使用 SQL 凭据作为用户名和密码来连接到 DataSnap 服务器。这些值可以在身份验证管理器中进行验证和/或简单地转发到底层 SQLConnection 组件以连接到 SQL 服务器。