Authentifizierung und Autorisierung
Nach oben zu DataSnap-Anwendungen entwickeln
Wenn Sie einen Server mit Servermethoden erstellt haben, können Sie die Logik zur Steuerung, wer diese Methoden aufrufen darf, hinzufügen. Dies kann mit der neuen und verbesserten Funktionalität der Komponente TDSAuthenticationManager durchgeführt werden.
Platzieren Sie diese Komponente auf Ihrem Formular, und legen Sie sie entsprechend der Konfiguration Ihres Servers als Authentifizierungsmanager für die Komponenten TDSHTTPWebDispatcher, TDHTTPService oder TDSTCPServerTransport fest.
Der Authentifizierungsmanager hat zwei Ereignisse: OnUserAuthenticate und OnUserAuthorize. Darüber hinaus besitzt er die Kollektion Roles.
Inhaltsverzeichnis
OnUserAuthenticate
Dieses Ereignis wird aufgerufen, wenn ein Benutzer zum ersten Mal eine Verbindung versucht (eine Methode aufruft). Das Ereignis übernimmt als Eingabeparameter Verbindungsinformationen, wie den Benutzernamen und das Passwort, und ermöglicht das Setzen eines Wertes für den in/out-Parameter valid
. Standardmäßig ist dieser Parameter auf True gesetzt, aber Sie können anhand der Benutzerinformationen oder anderer Informationen entscheiden, ob Sie valid
auf True oder False setzen möchten. Bei False wird die Benutzerverbindung abgelehnt und daher auch alle Aufrufe, die Benutzer versucht haben.
Wenn Sie valid
auf True setzen, können Sie auch auswählen, dass die übergebene Kollektion UserRoles gefüllt wird. Sie könnten beispielsweise Folgendes programmieren:
if (User = 'tom') and (Password = 'tom') then
UserRoles.Add('admin');
Hier wird, wenn ein Benutzer sich als "tom" mit dem korrekten Passwort anmeldet, diesem Benutzer eine Rolle namens "admin" zugeordnet. Anhand dieser Benutzerrollen kann später bei der Autorisierung die Implementierung des Ereignisses OnUserAuthorize vermieden werden.
Rollen
Rollen können auf unterschiedliche Weise definiert werden. Sie können in der Servermethodenklasse dem Code das Attribut TRoleAuth hinzufügen (erfordert die Unit Datasnap.DSAuth). Dieses Attribut kann auf Klassenebene oder Methodenebene wie folgt hinzugefügt werden:
[TRoleAuth('admin')]
TServerMethods1 = class(TComponent)
public
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
end;
Oder:
TServerMethods1 = class(TComponent)
public
[TRoleAuth('admin')]
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
end;
Im ersten Beispiel erfordern "EchoString" und "ReverseString", dass der Benutzer die Rolle "admin" hat, um die Methode aufzurufen. Im zweiten Beispiel ist nur der Methode "EchoString" die Rolle "admin" zugeordnet. Beachten Sie bitte, dass das Attribut TRoleAuth einen optionalen zweiten Parameter hat: Die Liste "Abgelehnte Rollen", die sich wie erwartet verhält. Beide Parameter können eine durch Komma getrennte Liste mit Rollen enthalten.
Rollen können auch mit der Kollektion "Roles" der Komponente AuthenticationManager definiert werden. Die Eigenschaft Roles ist eine Kollektion der Rolleneinträge, wobei jede Rolle eine zugehörige Klasse oder Methode hat, und eine Liste der autorisierten und/oder abgelehnten Rollen. In "AppliesTo" können Sie einen Klassennamen, wie TServerMethods1, angeben, der für alle Methoden dieser Klasse angewendet wird. Darüber hinaus können Sie einen generischen Methodennamen, wie "EchoString", festlegen, der dann für die Methode "EchoString" jeder Serverklasse angewendet würde. Alternativ können Sie beides festlegen: TServerMethods1.EchoString, um eine bestimmte Methode einer bestimmten Klasse anzuwenden.
Diese Rollen können auch zur Laufzeit gefüllt werden. Wenn Sie die Kollektion zur Laufzeit ändern möchten, um die Instanz von AuthenticationManager zu ermitteln, müssen Sie die Komponente, die diese Instanz verwendet, evtl. in ein Datenmodul verlagern, sofern Sie die Komponenteneinstellungen des Experten für REST-Anwendungen verwenden.
OnUserAuthorize
Das Ereignis OnUserAuthorize wird aufgerufen, wenn ein Benutzer, der bereits erfolgreich authentifiziert wurde, versucht, eine Servermethode aufzurufen. Sie müssen dieses Ereignis nicht implementieren. Wenn Sie der Liste "UserRoles" im Ereignis OnUserAuthenticate Rollen hinzufügen, dann kann allein anhand dieser Rollen entschieden werden, ob der Benutzer die Berechtigung hat, eine Servermethode aufzurufen. Wenn Sie jedoch eine größere Kontrolle über den Prozess haben möchten (z.B. Zulassen oder Ablehnen des Aufrufs auf Basis der Tageszeit), dann können Sie dieses Ereignis implementieren. Dem Ereignis wird ein Objekt übergeben, das Informationen enthält, wie z.B. den Benutzernamen, die im Authentifizierungsereignis gefüllte "UserRoles"-Liste und die zugelassenen/abgelehnten Rollen für die aufgerufene Methode. Anhand dieser Informationen sowie anhand beliebiger anderer Informationen entscheiden Sie, ob Sie den Wert von valid
auf True oder False setzen, wodurch der Aufruf der Methode zugelassen bzw. abgelehnt wird.