如何在Datasnap Server Methods单元中获取经过身份验证的用户名和密码?

米兰维达伦尼

一旦使用正确的参数名称(在Delphi Datasnap Server用户身份验证中说明),Datasnap身份验证就非常简单下一个问题是使用FireDAC数据库连接时能够使用那些相同的凭据。似乎以最有效的方式隐含了将SQL登录凭据传递到Delphi Datasnap服务器的答案尽管“简单转发”并没有真正解释如何完成代码。此外,这些凭据应通过与登录Datasnap服务器相同的凭据进行身份验证。这将防止在数据库级别进行模拟。

到目前为止,我还没有发现任何方法可以从“服务器方法”单元中以编程方式获取当前的Datasnap用户凭据。例如,在BeforeConnect事件中。我正在处理的代码是使用Session生命周期由Delphi XE7构建的独立服务器。

这是连接到Datasnap服务器并请求数据时发生的事件的描述:

让我进一步解释:

通过使用一些ShowMessage指令,我可以在连接并发出数据请求时跟踪Datasnap的流向。在受测服务器上运行,使我可以显示事件随附的各种参数的内容。设置完成后,运行连接到服务器并请求数据的客户端将导致以下结果:

客户端登录按钮

  • 出现了凭据对话(这是我的代码,而不是错误的TSQLConnection属性。)
  • 输入的用户名和密码。
  • 放置在TSQLConnection.Params中的参数表[DSAuthenticationPassword,DSAuthenticationUser]
  • 设置TSQLConnection.Connected:= True
  • 服务器事件OnUserAuthenticate

    此时,尽管服务器上没有进行任何其他操作,但已建立连接。最重要的是,ServerClass和ServerMethodsClass都没有被实例化。我看不到任何地方存储身份验证凭据。

客户端GetData按钮

  • 客户端连续打开两个客户端数据集。
  • 服务器DSServerClass1.Create。这显然意味着
    ServerTransport将请求识别为有效,并继续
    创建必要的资产来处理会话。
  • ServerMethodsUnit3.Create。在DSServerClass中埋藏的某个地方,有一个GetClass调用,该调用返回关联的ServerMethodsClass的名称。命名的类被实例化。由于ServerMethodsClass最终来自TDataModule,因此这也暗示了属性流。
  • OnUserAuthorize(显然是第一个数据集)
  • OnUserAuthorize(显然是第二个数据集)

数据返回给客户端(这时,数据库凭据被硬编码到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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Web API中获取经过身份验证的用户名(基于令牌的身份验证)

在IIS HTTP PlatformHandler前面使用Windows身份验证时,如何在Python中获取经过身份验证的用户名?

如何在 SqlServerMethod DataSnap Server 中返回 TByteDynArray

如何使用经过身份验证的用户名和密码离线下载网站?

如何从HTTP筛选器获取经过身份验证的用户名,IP地址和正在调用的控制器操作?

在ASP.NET Core 3.0中如何获取当前经过身份验证的用户名?

如何在Moya中设置基本身份验证用户名和密码?

Firebase / Swift 2-如何获取经过身份验证的用户密码和电子邮件

如何使用node.js中的基本身份验证从URL获取用户名和密码?

如何在事件侦听器中获取经过身份验证的用户-Laravel

如何在Olingo ODataServiceFactory中获取经过身份验证的用户的ID

如何在AWS Lambda函数中获取经过Cognito身份验证的用户信息?

如何在Spring Security身份验证登录中让用户输入用户名和密码的值

如何在.NET Web API 2.0的Controller中获取基本身份验证用户名/密码

WebSphere Liberty如何在server.xml中设置经过身份验证的用户?

如何在Laravel身份验证中处理列的自定义名称,用户名和密码

如何从.Net Core中单独的类库获取经过身份验证的用户

如何从Blazor中的数据库获取经过身份验证的用户

如何仅在GraphRepository中获取经过身份验证的用户拥有的数据

使用nodejs,表达和基本身份验证如何获取用户名和密码

如何针对盐和散列的密码和用户名对用户进行身份验证?

如何将经过身份验证的用户名保存到数据库中

如何执行我自己的身份验证(检查用户键入的用户名和密码)

如何在 Cloud Functions 存储触发器中获取经过身份验证的 Firebase 用户的 uid

如何在Laravel的数据库的表中获取经过身份验证的用户存储的数据

如何在DataSnap中实现HTTPS?

如何使用用户名和密码对Kubernetes kubectl进行身份验证?

如何使用Java代码设置基本身份验证(用户名和密码)

如何为基本的HTTP身份验证设置用户名和密码?