delphi 中的数据库用户名和密码

database usernames and passwords in delphi

使用 Delphi XE2。

我有一个名为用户的数据库,里面有一个 table。它有一个 user_id 字段、用户名字段、密码字段和一个活动字段。 (user_id 是标识每个用户的唯一编号...1,2,3 等)。

我正在编写一个需要用户名和密码才能登录的数据库软件包。 (我已经创建了一个登录表单)。

如何获取数据库中的 match/check 用户名和密码,然后允许用户继续进入软件?另外我希望活动字段存储在数据库中 'Y' 如果用户已登录或 'N' 如果用户未登录。这可行吗?

我通过 TADQuery 和 TDataSource 连接到用户 table。

我认为可以让我入门的函数示例(在单击登录表单上的登录按钮时调用它)。

function TfrmLogin.CheckUser: Boolean;
begin
while not dmData.qryUser.Eof do
begin
if(editName.Text <> qryUser.FieldByName('uname').AsString) or (editPassword.Text <> qryUser.FieldByName('pword').AsString)
  then ShowMessage('Username and/or Password not recognised');
    Exit;
End;

循环遍历数据库中的所有行是不够的,尤其是当您获得的用户不多时。您需要从特定用户的数据库中 SELECT,然后查看是否能返回结果。您可以仅根据用户名执行 SELECT

qryUser.SQL.Text := 'SELECT uname, pword FROM users WHERE uName = :uname';
qryUser.ParamByName('uname').AsString := editName.Text;
try
  qryUser.Open;
  if qryUser.IsEmpty then // No record found for user
    // Handle error
  else
  begin
    if qryUser.FieldByName('pword').AsString <> editPassword.Text then
      // Handle password mismatch;
  end;
finally
  qryUser.Close;
end;

从您的问题中不清楚您正在使用哪些数据库组件(TADQuery 可能是 TADOQuery 的拼写错误,也可能是其他原因)。如果实际上是 TADOQuery,您需要对代码进行一些小的更改。 (实际上,只有三个小改动;两个在参数赋值上,一个在读取密码值上。)

qryUser.SQL.Text := 'SELECT uname, pword FROM users WHERE uName = :uname';
qryUser.Params.ParamByName('uname').Value := editName.Text;
try
  qryUser.Open;
  if qryUser.IsEmpty then // No record found for user
    // Handle error
  else
  begin
    if qryUser.FieldByName('pword').Value <> editPassword.Text then
      // Handle password mismatch;
  end;
finally
  qryUser.Close;
end;

我支持 Sam,如果可能,请不要将密码存储在数据库中。如果数据库支持 Active Directory 身份验证(MS/SQL、Oracle、DB2、MySQL、SyBase),请在尝试连接到数据库之前使用用户名和密码针对 Active Directory 进行验证。然后在Userstable.

中只存储用户名和active flag

此功能会在您尝试连接到数据库之前询问 Active Directory 用户和密码是否有效。然后,您可以构建与数据库的连接参数(我假设您使用的是 FireDAC 和 TADConnection see here 的说明)。尝试打开连接,如果失败则用户根本无权访问数据库。如果通过,则像 Ken 建议的那样查询用户 table,但测试活动字段而不是密码。这样就没有人可以看到用户密码,并且您不必在应用程序中管理密码。通过使用这种方法,即使您在数据库上使用 Active Directory 身份验证,某人仍然需要知道用户的 Active Directory 密码才能访问您的应用程序。

function TfrmPassword.ActiveDirectoryValidate: Boolean;
var
  LHandle: THandle;
  lDomainName: String;
begin
  Screen.Cursor := crHourglass;
  try
   // Get the Domain Name
   lDomainName := GetEnvironmentVariable('USERDOMAIN');
   // Test the user Logon
   Result := LogonUser(PWideChar(edtUserID.Text),
                       PWideChar(lDomainName),
                       PWideChar(edtPassword.Text),
                       LOGON32_LOGON_NETWORK,
                       LOGON32_PROVIDER_DEFAULT,
                       LHandle);
   // If True, we got a Handle, so close it
   if Result then
    CloseHandle(LHandle);

  finally
   Screen.Cursor := crDefault;
  end;
end;