- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一旦您使用正确的参数名称(Delphi Datasnap Server User Authentication 中进行了说明),Datasnap 身份验证就非常简单。下一个问题是在使用 FireDAC 数据库连接时能够使用相同的凭据。答案似乎隐含在Most efficient way to pass SQL Login credentials to Delphi Datasnap servers?中。尽管“简单转发”并没有真正解释如何完成代码。此外,这些凭据应与用于登录 Datasnap 服务器的相同凭据进行身份验证。这将防止数据库级别的模拟。
到目前为止,我还没有发现任何方法可以从服务器方法单元内以编程方式获取当前的 Datasnap 用户凭据。例如,在 BeforeConnect 事件中。我正在处理的代码是使用 Delphi XE7 使用 session 生命周期构建的独立服务器。
以下是连接到 Datasnap 服务器并请求数据时发生的事件的描述:
让我进一步解释一下:
通过使用一些 ShowMessage 指令,我可以在连接并发出数据请求时跟踪 Datasnap 的流程。在“测试”下运行服务器允许我显示事件附带的各种参数的内容。设置完成后,运行连接到服务器并请求数据的客户端将产生以下结果:
客户端登录按钮
服务器事件 OnUserAuthenticate
此时,连接已建立,尽管其他任何事情都没有发生发生在服务器上。最重要的是,ServerClass 都没有ServerMethodsClass 也没有被实例化。没有地方我可以看到它存储身份验证凭据。
客户端获取数据按钮
数据返回到客户端(此时数据库凭据被硬编码到 TFDConnection ConnectionDefinition 中,只是为了将其返回 工作。)
OnUserAuthorize 向 Sender 参数提供 nil 值;还提供了一个 TDSAuthorizeEventObject,它不包含任何我能够用来查找 ServerMethods 实例的引用,最后还有一个名为 Valid 的参数,它是一个用于授权用户的 bool 值。
请注意,TDSAuthorizeEventObject 包含对 TDSServerMethodUserEventObject 的引用,该引用确实包含用户名以及角色、授权角色和拒绝角色。然而,那又怎样呢?这让我回到了最初的问题:如何将其传达给 ServerMethodsUnit 中的代码?
最佳答案
过了一段时间,我在 Bob Swart 的白皮书中偶然发现了执行此操作的确切方法。有多种方法可让您在 Datasnap session 期间保留信息。这些属于 TDSSessionManager.GetThreadSession,分别是 GetData、PutData、RemoveData、HasData、GetObject、PutObject、RemoveObject 和 HasObject。这些方法实际上管理属于 session 一部分的两个字典。例如,在 UserAuthentication 事件中,您可以按如下方式存储用户名:
TDSSessionManager.GetThreadSession.PutData('entrykey', UserName);
稍后,在数据库连接的 OnBeforeConnect 事件中,您可以检索这些值以在连接中使用:
DBUserName := TDSessionManager.GetThreadSession.GetData('entrykey');
在实践中,我发现“对象”形式具有更大的值(value),但这两种形式都提供了一种强大的方法,可以在 session 的整个生命周期中保留您自己的数据,而无需诉诸外部媒体。
关于delphi - 如何在 Datasnap 服务器方法单元中获取经过身份验证的用户名和密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648275/
我是一名优秀的程序员,十分优秀!