Question
“How can I perform thread-safe logon validation? I have defined a Server.SessionParameters for UserName and Password and am using the Server.OnValidateSessionParameters event.
Solution
The Server is a singleton. This example shows how use a Delphi TCriticalSection object to ensure thread safety.
Download: CustomSeverLogging.zip
Sample Delphi code:
uses
SyncObjs;
{TForm1.FormCreate}
procedure TForm1.FormCreate(Sender: TObject);
begin
FLock := TCriticalSection.Create;
end;
{TForm1.FormDestroy}
procedure TForm1.FormDestroy(Sender: TObject);
begin
FLock.Free;
end;
{TForm1.rsServer1ValidateSessionParameters}
procedure TForm1.rsServer1ValidateSessionParameters(Sender: TObject; aParameters: TppParameterList; var aIsValid: Boolean);
begin
FLock.Acquire;
try
{validate the parameter names}
aIsValid := (aParameters.InList('UserName') and aParameters.InList('Password'));
if aIsValid then
aIsValid := PerformLoginValidation(aParameters['UserName'].Value, aParameters['Password'].Value);
finally
FLock.Release;
end;
end;
{TForm1.PerformLoginValidation}
function TForm1.PerformLoginValidation(const aUserName, aPassword: string): Boolean;
begin
Result := False;
// add database validation logic here
end;