Doing a “DefaultUsrPwDm” – Google Search, I bumped into the System.Classes.TLoginCredentialService class.
There is hardly any documentation.
It was introduced as [WayBack] System.Classes.TLoginCredentialService – XE2 API Documentation with the standard TObject template:
TObject is the ultimate ancestor of all objects and components.
System.Classes.TLoginCredentialService inherits from System.TObject. All content below this line refers to System.TObject.
TObject is the ultimate ancestor of all objects and components.
…
Although TObject is the based object of a component framework, not all objects are components. All component classes descend from TComponent.
Note: TObject is never directly instantiated. Although it does not use programming language features that prevent instantiation, TObject is an abstract class.
The documentation was updated in Delphi XE4 to [WayBack] System.Classes.TLoginCredentialService – RAD Studio API Documentation
TLoginCredentialService provides functionality for login action, regardless of framework.
TLoginCredentialService represents an extensible, framework agnostic, login credential service with support for callbacks (success, failure). It includes methods for:
- Getting user credentials: Domain, Username and Password.
- Registering and unregistering credentials from handlers.
See Also
That version also added [WayBack] System.Classes.ELoginCredendialError – RAD Studio API Documentation
ELoginCredendialError is the exception class for handling invalid login credentials.
ELoginCredendialError is raised when an application attempts to get specified, but unexisting, login credentials.
Nothing ever got added, no examples, no documentation, just look at for instance the Delphi Rio documentation:
Luckily, I found this for my research list (code at [WayBack] tlogincredentialservice.zip) : [WayBack] delphi – TLoginCredentialService usage example – Stack Overflow which uses globals, but that’s not the point of the demo (you can use different storage in your actual code)
I’ve just created a small demo of how to use it
Click here to download the code
In the following I’ll show some of the code:
First I need a record to hold Credentials, and a list of them :
Type
TCredential = record
Username, Password, Domain: string;
constructor Create(const aUsername, aPassword, aDomain: string);
function AreEqual(const aUsername, aPassword, aDomain: string): Boolean;
end;
TCredentialList = class(TList<TCredential>)
public
function IsValidCredential(const aUsername, aPassword, aDomain: string): Boolean;
end;
then we need to define a context in wich we are calling this. Thats just a application unique string wich identifyes each Loginfunction
const
Context = 'TForm1';
In Form create I create my list and add dummy data to it
procedure TForm1.FormCreate(Sender: TObject);
begin
CredentialList := TCredentialList.Create;
//Add Dummy data
CredentialList.Add(TCredential.Create('AA', 'AA', 'DomainAA'));
CredentialList.Add(TCredential.Create('BB', 'BB', 'DomainAA'));
CredentialList.Add(TCredential.Create('CC', 'CC', 'DomainAA'));
// Register your Login handler in a context.
// This method is called when you try to login
// by caling TLoginCredentialService.GetLoginCredentials();
TLoginCredentialService.RegisterLoginHandler(Context, LoginCredentialEvent);
end;
I have placed a button on my form from wich I make my call to login :
procedure TForm1.Button1Click(Sender: TObject);
begin
// The actual call to login
// First param is the context
// Second Parameres is a callback function given to the event handler.
TLoginCredentialService.GetLoginCredentials(Context,
function { LoginFunc } (const Username, Password, Domain: string): Boolean
begin
//The actual user validation
Result := CredentialList.IsValidCredential(Username, Password, Domain);
end);
end;
Finally I just need to implement my loginhandler:
//This is the "onLogin" event handler.
//This is called durring a login attempt
//The purpose of this event handler are to call tha callBack function with correct information
//and handle the result
procedure TForm1.LoginCredentialEvent(Sender: TObject; Callback: TLoginCredentialService.TLoginEvent; var Success: Boolean);
begin
//Call the callback
Callback(Sender, LabeledEdit1.Text, LabeledEdit2.Text, LabeledEdit3.Text, Success);
//Handle the success.
if Success then
Label1.Caption := 'Yes'
else
Label1.Caption := 'No';
end;
Hope this answers the question.Dont forget to download the complete code here
–jeroen