Delphi中的数据库用户名和密码?

3
我想在Delphi中创建一种登录窗口。不幸的是,我无法将其与用户名和密码匹配。
我有一个基本的.mdb数据库,其中包含一个Users表。在这个表中,有一个用户名和密码。我希望Delphi在数据库中检查用户名和密码,如果与编辑框中的内容匹配,则转到下一个表单或显示消息,否则不执行任何操作。当我输入数据库的第一行用户名和密码时,我成功了,但是第二行没有成功。我感觉需要一种方法让它继续进行第二行的值并检查那些内容等等。当前数据库中也没有关系。
这是我的数据访问布局:ADOConnection->ADOTable->DataSource 提前致谢!

你能否包含你的表结构和用于验证用户和密码的代码? - RRUZ
最好不要在数据库中存储明文密码,而是使用带有一些盐(例如用户名)的哈希值。 - Arnaud Bouchez
我理解OP可能认为你的Hash with Some Salt实际上是一些早餐食品,包括土豆。 - Warren P
是的,使用带盐的哈希函数是正确的方法。您可以使用md5或sha-1函数。例如,它非常适用于密码和信用卡号码。 - Hendra
1个回答

2

根据您的猜测,一种解决方案是逐条移动记录以检查每个记录。例如:

function MatchPass(Table: TADOTable; const Name, Pass: string): Boolean;
begin
  Result := False;
  Table.First;
  while not Table.Eof do begin
    if Table.FieldByName('Username').AsString = Name then begin
      Result := Table.FieldByName('Password').AsString = Pass;
      Exit;
    end;
    Table.Next;
  end;
end;

可以这样调用:

  if MatchPass(ADOTable1, Edit1.Text, Edit2.Text) then
    ..

另一个解决方案是让ADOTable搜索相应的记录:
function MatchPass(Table: TADOTable; const Name, Pass: string): Boolean;
begin
  Result := Table.Locate('Username;Password', VarArrayOf([Name, Pass]), []);
end;

仅使用SQL语句不是更好吗? - RRUZ
@RRUZ - 我不确定哪个会有显着的优势。但是,我们已经有了一个在问题中给出的ADOTable。 - Sertac Akyuz
谢谢Sertac!我没有理由使用ADOTable,而不是ADOQuery。因此出于好奇,SQL语句会是什么样子? - coder123
1
@coder - 大概是这样的 "select password from passwords where user = :Username",然后提供一个用户名参数的值并读取密码字段。 - Sertac Akyuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接