База данных имен пользователей и паролей в 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;
Другие вопросы по тегам