一旦使用正确的参数名称(在Delphi Datasnap Server用户身份验证中说明),Datasnap身份验证就非常简单。下一个问题是使用FireDAC数据库连接时能够使用那些相同的凭据。似乎以最有效的方式隐含了将SQL登录凭据传递到Delphi Datasnap服务器的答案?尽管“简单转发”并没有真正解释如何完成代码。此外,这些凭据应通过与登录Datasnap服务器相同的凭据进行身份验证。这将防止在数据库级别进行模拟。
到目前为止,我还没有发现任何方法可以从“服务器方法”单元中以编程方式获取当前的Datasnap用户凭据。例如,在BeforeConnect事件中。我正在处理的代码是使用Session生命周期由Delphi XE7构建的独立服务器。
这是连接到Datasnap服务器并请求数据时发生的事件的描述:
让我进一步解释:
通过使用一些ShowMessage指令,我可以在连接并发出数据请求时跟踪Datasnap的流向。在受测服务器上运行,使我可以显示事件随附的各种参数的内容。设置完成后,运行连接到服务器并请求数据的客户端将导致以下结果:
客户端登录按钮
服务器事件OnUserAuthenticate
此时,尽管服务器上没有进行任何其他操作,但已建立连接。最重要的是,ServerClass和ServerMethodsClass都没有被实例化。我看不到任何地方存储身份验证凭据。
客户端GetData按钮
数据返回给客户端(这时,数据库凭据被硬编码到TFDConnection ConnectionDefinition中,以使其正常工作。)
OnUserAuthorize为Sender参数提供一个nil值;还展示了一个TDSAuthorizeEventObject,它不包含我用来查找ServerMethods实例的任何引用,最后还包含一个名为Valid的参数,该参数是用于授权用户的布尔值。
请注意,TDSAuthorizeEventObject包含对TDSServerMethodUserEventObject的引用,该DOES包含用户名以及角色,授权角色和拒绝角色。但是,那又如何呢?这使我回到最初的问题:如何将其传达给ServerMethodsUnit中的代码?
一段时间后,我在Bob Swart的白皮书中偶然发现了执行此操作的确切方法。有几种方法可以使您在Datasnap会话期间保留信息。这些属于TDSSessionManager.GetThreadSession,分别是GetData,PutData,RemoveData,HasData,GetObject,PutObject,RemoveObject和HasObject。这些方法实际上管理作为Session一部分的两个字典。因此,例如,在UserAuthentication事件中,您可以按以下方式存储用户名:
TDSSessionManager.GetThreadSession.PutData('entrykey', UserName);
稍后,在数据库连接的OnBeforeConnect事件中,您可以检索以下值以用于连接中:
DBUserName := TDSessionManager.GetThreadSession.GetData('entrykey');
在实践中,我发现“对象”形式具有更大的价值,但无论哪种形式都可以提供一种有效的方式来在会话的整个生命周期中持久保存自己的数据,而无需借助外部媒体。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句