サーバー ログインの制御
データベースへの接続:インデックス への移動
大半のリモート データベース サーバーには、不正なアクセスを禁止するセキュリティ機能が組み込まれています。 サーバーは通常、データベースへのアクセスを許可する前にユーザー名とパスワードによるログインを要求します。
設計時には、サーバーがログインを要求する場合、ユーザーがデータベースに初めて接続しようとしたときに標準のログイン ダイアログ ボックスが表示され、ユーザー名とパスワードの入力を求められます。
実行時には、サーバーのログイン要求を処理できる方法は以下の 3 とおりあります。
第 1 は、デフォルトのログイン ダイアログおよびプロセスにログインを処理させる方法です。 これがデフォルトのアプローチです。 この場合、接続コンポーネントの LoginPrompt プロパティを true(デフォルト)に設定し、Delphi を使用している場合は、接続コンポーネントを宣言するユニットの uses 句に DBLogDlg を追加します。 C++Builder を使用している場合は、接続コンポーネントを宣言するユニットに DBLogDlg.hpp ヘッダー ファイルをインクルードします。 正常に動作するためには、C++Builder プロジェクトに Pascal ユニットを追加する必要もあります。 この新しい Pascal ユニットでは、ヘッダーをインクルードするとともに、DBLogDlg を uses 句に追加します。 そうしないと、デフォルトのログイン ダイアログが見つかりません。DBLogDlg をユーザーのメイン ファイルの uses セクションに追加してください。 というエラー メッセージが IDE で出力されます。 サーバーがユーザー名とパスワードを要求すると、アプリケーションに標準のログイン ダイアログ ボックスが表示されます。
第 2 は、ログインを試みる前にログイン情報を提供する方法です。 各種の接続コンポーネントでは、ユーザー名とパスワードを指定するために、以下のような異なるメカニズムが使用されます。
- BDE、dbExpress、InterBase Express の各データセットの場合は、Params プロパティを通じてユーザー名とパスワードの接続パラメータにアクセスできます (パラメータ値は、BDE データセットの場合は BDE エイリアスに、dbExpress データセットの場合は接続名に、それぞれ関連付けることもできます)。
- ADO データセットの場合は、ユーザー名とパスワードを ConnectionString プロパティに含めることができます(あるいは Open メソッドへのパラメータとして提供できます)。
サーバーが要求する前にユーザー名とパスワードを指定する場合は、デフォルトのログイン ダイアログが表示されないように、必ず LoginPrompt を false に設定しておいてください。 たとえば、以下のコードでは BeforeConnect イベント ハンドラ内でユーザー名とパスワードを SQL 接続コンポーネントに設定しています。現在の接続名に関連付けられている暗号化パスワードが解読されます。
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;
void __fastcall TForm1::SQLConnectionBeforeConnect(TObject *Sender) { if (SQLConnection1->LoginPrompt == false) { SQLConnection1->Params->Values["User_Name"] = "SYSDBA"; SQLConnection1->Params->Values["Password"] = Decrypt(SQLConnection1->Params->Values["Password"]); } }
ユーザー名とパスワードを設計時に設定したり、ハードコードされた文字列をコード内で使用すると、それらの値がアプリケーションの実行可能ファイルに埋め込まれることに注意してください。 それでもこれらは簡単に見つけることができるので、サーバーのセキュリティが低下します。
第 3 は、ログイン イベントのカスタム処理を独自に行うことです。 接続コンポーネントは、ユーザー名とパスワードが必要になると、イベントを発生させます。
- TDatabase、TSQLConnection、TIBDatabase の場合、それは OnLogin イベントです。 そのイベント ハンドラにはパラメータが 2 つあります。1 つは接続コンポーネント、もう 1 つはユーザー名とパスワードのパラメータで構成される文字列リストのローカル コピーです(TSQLConnection にはデータベース パラメータも含まれています)。 このイベントを発生させるためには、LoginPrompt プロパティを true に設定する必要があります。 LoginPrompt の値を false にして OnLogin イベントのハンドラを割り当てると、データベースにログインできなくなります。デフォルトのログイン ダイアログが表示されず、OnLogin イベント ハンドラが決して実行されないからです。
- TADOConnection の場合、発生するイベントは OnWillConnect イベントです。 そのイベント ハンドラにはパラメータが 5 つあります。1 つは接続コンポーネント、残りは接続を左右する値を返す 4 つのパラメータ(ユーザー名とパスワードの 2 つのパラメータを含む)です。 このイベントは、LoginPrompt の値に関係なく常に発生します。
このイベントのイベント ハンドラを作成し、その中でログイン パラメータを設定します。 以下は、USER NAME パラメータと PASSWORD パラメータの値がそれぞれ、グローバル変数(UserName)と、指定されたユーザー名のパスワードを返すメソッド(PasswordSearch)から与えられる例です。
procedure TForm1.Database1Login(Database: TDatabase; LoginParams: TStrings); begin LoginParams.Values['USER NAME'] := UserName; LoginParams.Values['PASSWORD'] := PasswordSearch(UserName); end;
void __fastcall TForm1::Database1Login(TDatabase *Database, TStrings *LoginParams) { LoginParams->Values["USER NAME"] = UserName; LoginParams->Values["PASSWORD"] = PasswordSearch(UserName); }
ログイン パラメータを提供する他のメソッドと同様に、OnLogin または OnWillConnect イベント ハンドラを作成するときは、パスワードをアプリケーション コードにハードコードしないようにしてください。 パスワードは、暗号化された値としてセキュア データベースに格納しアプリケーションで検索するか、ユーザーにその都度入力してもらう必要があります。