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:
- [WayBack] System.Classes.TLoginCredentialService – RAD Studio API Documentation
- [WayBack] System.Classes.ELoginCredentialError – RAD Studio API 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