Server-Anmeldungen steuern

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verbindungen zu Datenbanken einrichten - Index


Die meisten externen Datenbankserver verfügen über Sicherheitsfunktionen, um unerlaubte Zugriffe zu verhindern. Im Allgemeinen fordert der Server einen Benutzernamen und ein Passwort an, bevor er Zugriff auf eine Datenbank gewährt.

Falls zur Entwurfszeit ein Server eine Anmeldung erfordert, fragt ein Standard-Anmeldedialogfeld beim ersten Verbindungsversuch mit der Datenbank einen Benutzernamen und ein Passwort ab.

Zur Laufzeit gibt es drei Möglichkeiten, die Anmeldungsanforderung des Servers zu verarbeiten:

Die erste Möglichkeit ist, die Anmeldung über das Standard-Anmeldedialogfeld und die zugehörigen Prozesse zu handhaben. Dies ist das Standardvorgehen. Setzen Sie die Eigenschaft LoginPrompt der Verbindungskomponente auf True (Vorgabe), und fügen Sie (in Delphi) der uses-Klausel der Unit, die die Verbindungskomponente deklariert, DBLogDlg hinzu. Ihre Anwendung zeigt das Standard-Anmeldedialogfeld an, wenn der Server einen Benutzernamen und ein Passwort anfordert.

Die zweite Möglichkeit ist, die Anmeldeinformation vor dem Anmeldeversuch bereitzustellen. Jeder Verbindungskomponententyp verwendet einen anderen Mechanismus, um den Benutzernamen und das Passwort anzugeben:

  • Bei BDE-, dbExpress- und InterBase-Express-Datenmengen werden die Verbindungsparameter für Benutzername und Passwort über die Eigenschaft Params zur Verfügung gestellt. (Bei BDE-Datenmengen kann den Parameterwerten auch ein BDE-Alias zugeordnet werden, bei dbExpress-Datenmengen dagegen ein Verbindungsname.)
  • Bei ADO-Datenmengen können der Benutzername und das Passwort in die Eigenschaft ConnectionString aufgenommen (oder als Parameter für die Methode Open bereitgestellt) werden.

Falls Sie den Benutzernamen und das Passwort angeben, bevor der Server sie anfordert, setzen Sie LoginPrompt unbedingt auf False, damit das Standarddialogfeld für die Anmeldung nicht angezeigt wird. Der folgende Code setzt beispielsweise den Benutzernamen und das Passwort für eine SQL-Verbindungskomponente in der Ereignisbehandlungsroutine BeforeConnect, wodurch ein verschlüsseltes Passwort entschlüsselt wird, das dem aktuellen Verbindungsnamen zugeordnet ist:

 procedure TForm1.SQLConnectionBeforeConnect(Sender: TObject);
 begin
   with Sender as TSQLConnection do
   begin
     if LoginPrompt = False then
     begin
       Params.Values['User_Name'] := 'SYSDBA';
       Params.Values['Password'] := Decrypt(Params.Values['Password']);
     end;
   end;
 end;

Beachten Sie, dass beim Setzen des Benutzernamens und des Passworts zur Entwurfszeit oder durch die Verwendung festcodierter Strings im Code diese Werte in die ausführbare Datei der Anwendung eingebettet werden. Dort sind sie leicht zu finden und gefährden damit die Sicherheit des Servers.

Die dritte Möglichkeit ist, eine eigene Ereignisbehandlungsroutine für das Anmeldeereignis bereitzustellen. Die Verbindungskomponente erzeugt ein Ereignis, wenn sie den Benutzernamen und das Passwort benötigt.

  • Für TDatabase, TSQLConnection und TIBDatabase ist dies ein OnLogin-Ereignis. Die Ereignisbehandlungsroutine verarbeitet zwei Parameter, die Verbindungskomponente und in einer Stringliste eine lokale Kopie der Parameter für Benutzername und Passwort. (TSQLConnection beinhaltet auch den Datenbankparameter). Sie müssen die Eigenschaft LoginPrompt auf True setzen, damit dieses Ereignis eintritt. Ist LoginPrompt auf False gesetzt und dem Ereignis OnLogin eine Ereignisbehandlungsroutine zugewiesen, entsteht eine Situation, in der es unmöglich ist, sich bei der Datenbank anzumelden, weil das Standarddialogfeld nicht erscheint und die Ereignisbehandlungsroutine für OnLogin niemals ausgeführt wird.
  • Bei TADOConnection ist das Ereignis ein OnWillConnect-Ereignis. Die Ereignisbehandlungsroutine verarbeitet fünf Parameter, nämlich die Verbindungskomponente sowie vier Parameter, die Werte zurückgeben, die die Verbindung beeinflussen (worin auch zwei für den Benutzernamen und das Passwort enthalten sind). Dieses Ereignis tritt immer ein, unabhängig vom Wert von LoginPrompt.

Schreiben Sie eine Ereignisbehandlungsroutine für das Ereignis, in der Sie die Anmeldeparameter setzen. Im folgenden Beispiel werden die Werte für die Parameter USER NAME und PASSWORD aus einer globalen Variable (UserName) und einer Methode bereitgestellt, die ein Passwort für einen bestimmten Benutzernamen (PasswordSearch) zurückgibt:

 procedure TForm1.Database1Login(Database: TDatabase; LoginParams: TStrings);
 begin
   LoginParams.Values['USER NAME'] := UserName;
   LoginParams.Values['PASSWORD'] := PasswordSearch(UserName);
 end;

Wie bei den anderen Methoden zur Bereitstellung von Anmeldeparametern sollten Sie auch bei der Entwicklung der Ereignisbehandlungsroutinen für OnLogin oder OnWillConnect vermeiden, das Passwort im Anwendungscode hart zu codieren. Es sollte stattdessen als verschlüsselter Wert erscheinen, als Eintrag in einer Sicherheitsdatenbank, aus der Ihre Anwendung den Wert lädt, oder während der Programmausführung vom Benutzer eingegeben werden.

Siehe auch