delphi - 带身份验证的 DataSnap 回调

标签 delphi authentication callback delphi-xe datasnap

我可以在 datasnap 服务器和客户端之间使用“回调”作为示例 here作者:帕维尔·格洛瓦茨基 但是,当我通过简单例份验证在服务器表单上添加 DSAuthenticationManager1 时,我无法在客户端注册回调。

我收到此错误:“异常类 TDBXError,带有消息“远程错误:身份验证管理器拒绝了用户凭据。这可能是由于 DS 用户名和密码的组合无效”。”

我在客户端向 SQLConnection 添加了登录详细信息,如下所示:

SQLConnection1.Params.Values['DSAuthenticationUser'] :=  Username;
SQLConnection1.Params.Values['DSAuthenticationPassword'] := Password;

所以我的 SQLConnection1 成功连接到服务器。但我找不到 DSAuthenticationManager1 的任何方法。

如何将登录参数导入 DSAuthenticationManager1?

最佳答案

Delphi-XE 中的 TDSClientCallbackChannelManager 组件不包含与 Delphi-XE2 中相同的属性。当我将此组件添加到我的项目 (XE2) 时,我有 UsernamePassword 属性,这些属性将传递到 DataSnap 服务器的 DSAuthenticationManager.OnUserAuthenticate每当调用 RegisterCallback()UnregisterCallback() 时都会调用该方法。

您有最新的 XE 更新吗?如果最新更新中没有用户名和密码,则您可能需要升级到 XE2 才能在 DataSnap 服务器中使用 TDSAuthenticationManager 和在客户端中使用 TDSClientCallbackChannelManager

我认为也许您可以从 TSDClientCallbackChannelManager 创建您自己的类,并重写将用户名和密码添加到 DBXConnection 的方法 - 从而为您提供了一种自行添加它们的方法。我尝试了这个,但是需要重写的方法不是虚拟的。我想也许我可以通过将新类中同名的方法提升为 public 来隐藏祖先方法,而它们在祖先类中是 protected 。它生成代码并将其链接到我的客户端应用程序(通过新代码行旁边的蓝点可以明显看出),但它不会在运行时调用我的代码。它始终调用祖先方法(DBXConnectionPropertiesExecuteRemote)。

我认为您唯一的解决方案是更新到 XE2,或者不使用服务器上的身份验证管理器。

关于delphi - 带身份验证的 DataSnap 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18919941/

相关文章:

delphi - 为什么在TObject中使用“T”前缀?

delphi - 如何使用 rtti 列出属性的属性?

c# - 保护基于 REST 的 WCF 服务

string - 在 Delphi XE4 中使用 AnsiString 之类的数组字节

Delphi - 使用不同的TTable和TQuery作为一个对象

PHP登录: best way to show different contents between logged-in and not logged users

http - 如何在 Active Directory 中使用 NTLM 身份验证

javascript - 回调究竟如何获取它们的参数?

javascript - 如何在以下 promise 代码中传递函数参数

function - 如何用简单的英语解释回调?它们与从一个函数调用另一个函数有何不同?