База данных имен пользователей и паролей в delphi
Использование Delphi XE2.
У меня есть база данных с таблицей в ней под названием пользователи. В нем есть поле user_id, поле username, поле password и поле 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;
2 ответа
Циклического перебора всех строк в базе данных будет недостаточно, особенно если вы получаете больше, чем несколько пользователей. Вам нужно 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;
Я с Сэмом, если возможно, не храню пароли в базе данных. Если база данных поддерживает проверку подлинности Active Directory (MS/SQL, Oracle, DB2, MySQL, SyBase), используйте имя пользователя и пароль для проверки Active Directory перед попыткой подключения к базе данных. Затем сохраните только имя пользователя и активный флаг в таблице Users.
Эта функция спрашивает Active Directory, если имя пользователя и пароль действительны, прежде чем пытаться установить соединение с базой данных. Затем вы можете построить параметры подключения к базе данных (я предполагаю, что вы используете FireDAC и TADConnection, см. Здесь для получения инструкций). Попробуйте открыть соединение, в случае сбоя пользователь вообще не имеет доступа к базе данных. Если это пройдет, то запросите таблицу Users, как предлагает Кен, но протестируйте активное поле вместо пароля. Таким образом, никто не может видеть пароль пользователя, и вам не нужно управлять паролями в вашем приложении. При использовании этого метода кому-то еще нужно знать пароль пользователя 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;