![](/img/trans.png)
[英]I'm stuck, how can I implement 2 different server methods in datasnap rest Delphi
[英]How can I obtain the authenticated Username and Password in a Datasnap Server Methods unit?
一旦使用正确的参数名称(在Delphi Datasnap Server用户身份验证中说明),Datasnap身份验证非常简单。 下一个问题是在使用FireDAC数据库连接时能够使用这些相同的凭据。 答案似乎隐含在最有效的方式将SQL登录凭据传递给Delphi Datasnap服务器? 虽然“简单转发”并没有真正解释如何完成代码。 此外,这些凭据应该作为用于登录Datasnap服务器的相同凭据进行身份验证。 这样可以防止在数据库级别进行模拟。
到目前为止,我还没有找到任何方法从Server Methods单元中以编程方式获取当前的Datasnap用户凭据。 例如,在BeforeConnect事件中。 我正在使用的代码是使用会话生命周期使用Delphi XE7构建的独立服务器。
以下是连接到Datasnap服务器并请求数据时发生的事件的说明:
让我进一步解释一下:
通过使用一些ShowMessage指令,我可以在连接并发出数据请求时跟踪Datasnap的流程。 在Test下运行服务器允许我显示事件附带的各种参数的内容。 设置完成后,运行连接到服务器并请求数据的客户端会产生以下结果:
客户登录按钮
服务器事件OnUserAuthenticate
此时,虽然服务器上没有其他任何内容,但已建立连接。 最重要的是,ServerClass和ServerMethodsClass都没有实例化。 我无法看到存储身份验证凭据的位置。
客户端GetData按钮
数据返回给客户端(此时,数据库凭据被硬编码到TFDConnection ConnectionDefinition中,只是为了让它工作。)
OnUserAuthorize使用nil值显示Sender参数; 还提供了一个TDSAuthorizeEventObject,它不包含我能够用来查找ServerMethods实例的任何引用,最后还有一个名为Valid的参数,一个用于授权用户的布尔值。
请注意,TDSAuthorizeEventObject包含对TDSServerMethodUserEventObject的引用,该引用包含用户名以及角色,授权角色和拒绝角色。 但是,那又怎样? 这让我回到原来的问题: 如何将此信息传达给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');
在实践中,我发现“对象”形式具有更大的价值,但任何一种形式都提供了一种强大的方式,可以在不诉诸外部媒体的情况下在会话期间保留您自己的数据。
在链接的问题中 , TServerContainer1.DSAuthenticationManager1UserAuthenticate
方法具有User
和Password
参数。 您的服务器端代码可以从请求参数中检索凭据,验证它们,然后重新使用它们进行数据库身份验证。
procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate(
Sender: TObject; const Protocol, Context, User, Password: string;
var valid: Boolean; UserRoles: TStrings);
if UserService.isUserValid(User, Password) then
begin
// use User and Password ...
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.