0

使用德尔福 XE2。

我有一个数据库,其中有一个名为 users 的表。它有一个 user_id 字段、一个用户名字段、一个密码字段和一个 Active 字段。(user_id 是标识每个用户的唯一编号...... 1,2,3 等)。

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

如何让它匹配/检查数据库中的用户名和密码,然后允许用户继续进入软件?另外,如果用户已登录,我希望活动字段存储在数据库中“Y”或“N”,如果用户未登录。这可行吗?

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

下面是我认为可以让我入门的功能示例(在单击登录表单上的登录按钮时调用它)。

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;
4

2 回答 2

1

遍历数据库中的所有行是不够的,尤其是当您获得的用户数量超过少数时。您需要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;
于 2015-02-11T01:01:40.280 回答
0

我和山姆在一起,如果可能的话,不要在数据库中存储密码。如果数据库支持 Active Directory 身份验证(MS/SQL、Oracle、DB2、MySQL、SyBase),请在尝试连接到数据库之前使用用户名和密码针对 Active Directory 进行验证。然后只将用户名和活动标志存储在用户表中。

在您尝试连接到数据库之前,此功能会询问 Active Directory 用户和密码是否有效。然后您可以建立与数据库的连接参数(我假设您使用的是 FireDAC 和 TADConnection,请参阅此处获取说明)。尝试打开连接,如果失败,则用户根本无法访问数据库。如果通过,则像 Ken 建议的那样查询用户表,但测试活动字段而不是密码。这样,没有人可以看到用户密码,并且您不必在应用程序中管理密码。通过使用这种方法,即使您在数据库上使用 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;
于 2015-02-11T13:35:47.600 回答