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;
使用 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;