Dbsecur.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {         Copyright (c) 1998 Master-Bank                }
  7. {                                                       }
  8. {*******************************************************}
  9. unit DBSecur;
  10. interface
  11. {$I RX.INC}
  12. uses SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  13.   Messages, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables,
  14.   RxLogin, LoginDlg, ChPswDlg;
  15. type
  16.   TCheckUserEvent = function(UsersTable: TTable;
  17.     const Password: string): Boolean of object;
  18. { TDBSecurity }
  19.   TDBSecurity = class(TRxCustomLogin)
  20.   private
  21.     FDatabase: TDatabase;
  22.     FUsersTableName: TFileName;
  23.     FLoginNameField: PString;
  24.     FSelectAlias: Boolean;
  25.     FOnCheckUser: TCheckUserEvent;
  26.     FOnChangePassword: TChangePasswordEvent;
  27.     procedure SetDatabase(Value: TDatabase);
  28.     procedure SetUsersTableName(const Value: TFileName);
  29.     function GetLoginNameField: string;
  30.     procedure SetLoginNameField(const Value: string);
  31.   protected
  32.     function DoCheckUser(UsersTable: TTable; const UserName,
  33.       Password: string): Boolean; dynamic;
  34.     function DoLogin(var UserName: string): Boolean; override;
  35.     procedure Loaded; override;
  36.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  37.   public
  38.     constructor Create(AOwner: TComponent); override;
  39.     destructor Destroy; override;
  40.     function ChangePassword: Boolean;
  41.   published
  42.     property Database: TDatabase read FDatabase write SetDatabase;
  43.     property LoginNameField: string read GetLoginNameField write SetLoginNameField;
  44.     property SelectAlias: Boolean read FSelectAlias write FSelectAlias default False;
  45.     property UsersTableName: TFileName read FUsersTableName write SetUsersTableName;
  46.     property Active;
  47.     property AllowEmptyPassword;
  48.     property AttemptNumber;
  49.     property IniFileName;
  50.     property MaxPasswordLen;
  51.     property UpdateCaption;
  52. {$IFDEF WIN32}
  53.     property UseRegistry;
  54. {$ENDIF}
  55.     property OnCheckUser: TCheckUserEvent read FOnCheckUser write FOnCheckUser;
  56.     property OnChangePassword: TChangePasswordEvent read FOnChangePassword
  57.       write FOnChangePassword;
  58.     property AfterLogin;
  59.     property BeforeLogin;
  60.     property OnUnlock;
  61.     property OnUnlockApp;
  62.     property OnIconDblClick;
  63.   end;
  64. implementation
  65. uses AppUtils, VCLUtils;
  66. { TDBSecurity }
  67. constructor TDBSecurity.Create(AOwner: TComponent);
  68. begin
  69.   inherited Create(AOwner);
  70.   FSelectAlias := False;
  71.   FLoginNameField := NullStr;
  72. end;
  73. destructor TDBSecurity.Destroy;
  74. begin
  75.   DisposeStr(FLoginNameField);
  76.   inherited Destroy;
  77. end;
  78. procedure TDBSecurity.Notification(AComponent: TComponent; Operation: TOperation);
  79. begin
  80.   inherited Notification(AComponent, Operation);
  81.   if (Operation = opRemove) and (AComponent = Database) then Database := nil;
  82. end;
  83. procedure TDBSecurity.Loaded;
  84. begin
  85.   inherited Loaded;
  86.   if not (csDesigning in ComponentState) and Active and
  87.     (Database <> nil) then
  88.   begin
  89.     Database.LoginPrompt := True;
  90.     if not Login then begin
  91.       TerminateApplication;
  92.     end;
  93.   end;
  94. end;
  95. procedure TDBSecurity.SetDatabase(Value: TDatabase);
  96. begin
  97.   if FDatabase <> Value then begin
  98.     FDatabase := Value;
  99. {$IFDEF WIN32}
  100.     if Value <> nil then Value.FreeNotification(Self);
  101. {$ENDIF}
  102.   end;
  103. end;
  104. procedure TDBSecurity.SetUsersTableName(const Value: TFileName);
  105. begin
  106.   if FUsersTableName <> Value then FUsersTableName := Value;
  107. end;
  108. function TDBSecurity.GetLoginNameField: string;
  109. begin
  110.   Result := FLoginNameField^;
  111. end;
  112. procedure TDBSecurity.SetLoginNameField(const Value: string);
  113. begin
  114.   AssignStr(FLoginNameField, Value);
  115. end;
  116. function TDBSecurity.DoCheckUser(UsersTable: TTable; const UserName,
  117.   Password: string): Boolean;
  118. var
  119.   SaveLoggedUser: string;
  120. begin
  121.   if Assigned(FOnCheckUser) then begin
  122.     SaveLoggedUser := LoggedUser;
  123.     try
  124.       SetLoggedUser(UserName);
  125.       Result := FOnCheckUser(UsersTable, Password);
  126.     finally
  127.       SetLoggedUser(SaveLoggedUser);
  128.     end;
  129.   end
  130.   else Result := True;
  131. end;
  132. function TDBSecurity.DoLogin(var UserName: string): Boolean;
  133. var
  134.   IconClick: TNotifyEvent;
  135. begin
  136.   IconClick := OnIconDblClick;
  137.   if Assigned(IconClick) then IconClick := DoIconDblClick;
  138.   Result := LoginDialog(Database, AttemptNumber, UsersTableName,
  139.     LoginNameField, MaxPasswordLen, DoCheckUser, IconClick, UserName,
  140.     IniFileName, UseRegistry, SelectAlias);
  141. end;
  142. function TDBSecurity.ChangePassword: Boolean;
  143. begin
  144.   Result := ChangePasswordDialog(Database, AttemptNumber, UsersTableName,
  145.     LoginNameField, LoggedUser, MaxPasswordLen, AllowEmptyPassword,
  146.     FOnChangePassword);
  147. end;
  148. end.