Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2012, 16:18   #1
stevieg
Пользователь
 
Регистрация: 28.11.2011
Сообщений: 24
По умолчанию

Здравствуйте, уважаемые форумчане.
Прошу у вас помощи.
Нужно организовать процедуру проверки логина и пароля пользователя.
Логины и пароли хранятся в таблице *.mbd (access), в двух столбцах login и pass, соответственно. Таблицу я поключаю с помощью ADO-компонентов и отображаю в DBGrid.
На форме авторизации имеется 2 Edit'a, для ввода логина и пароля и баттон, на которых и будет вешаться процедура входа.
Что конкретно нужно:
Написать на кнопку код, который будет считывать введенный логин и пароль с Edit'ов и искать соответствующую пару логин + пароль в таблице, и, соответственно, либо пускать пользователя в систему, либо нет.

Заранее, больше спасибо. Расчитываю на вашу помощь.

Товарищи, что никто не поможет?

Последний раз редактировалось Stilet; 03.10.2012 в 10:27.
stevieg вне форума Ответить с цитированием
Старый 03.10.2012, 09:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, а какая конкретно помощь нужна?
банальный же запрос "в лоб" решает вашу проблему:
Код:
AdoQuery1.Close;
AdoQuery1.Text := 'select id, uName from PassTbl '+
   ' where login='+QuotedStr( Edit1.Text ) + 
   '  and passw='+QuotedStr( Edit2.Text );
AdoQuery1.Open;
if  AdoQuery1.RecordCount = 0 then ShowMessage('Нет такого логина/пароля!')
else  begin
  if AdoQuery1.RecordCount > 1 then ShowMessage('Ошибка! В БД более одного пользователя имеют такие же логина+пароль!')
  else
      // Отлично! Пользователь найден!
      ShowMessage('Поздравляю '+AdoQuery1.FieldByName('uName').AsString+
                           ' с успешной авторизацией!')
end;
AdoQuery1.Close; {закроем датасет, он нам больше не нужен!}

во-вторых, в целях безопасности намного лучше в БД хранить не сами пароли,
а их цифровой оттиск - хеш-функцию (MD5 "с солью", например). Тогда пользователь-злоумышленник, получивший доступ к БД всё равно не сможет восстановить пароли и воспользоваться ими.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.10.2012, 11:06   #3
stevieg
Пользователь
 
Регистрация: 28.11.2011
Сообщений: 24
По умолчанию

Сергей, большое спасибо. Именно это мне и нужно было.
Про хэширование пароля вкурсе, реализовать вполне смогу.

Еще раз спасибо.
stevieg вне форума Ответить с цитированием
Старый 03.10.2012, 15:50   #4
stevieg
Пользователь
 
Регистрация: 28.11.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, а какая конкретно помощь нужна?
банальный же запрос "в лоб" решает вашу проблему:
Код:
AdoQuery1.Close;
AdoQuery1.Text := 'select id, uName from PassTbl '+
   ' where login='+QuotedStr( Edit1.Text ) + 
   '  and passw='+QuotedStr( Edit2.Text );
AdoQuery1.Open;
if  AdoQuery1.RecordCount = 0 then ShowMessage('Нет такого логина/пароля!')
else  begin
  if AdoQuery1.RecordCount > 1 then ShowMessage('Ошибка! В БД более одного пользователя имеют такие же логина+пароль!')
  else
      // Отлично! Пользователь найден!
      ShowMessage('Поздравляю '+AdoQuery1.FieldByName('uName').AsString+
                           ' с успешной авторизацией!')
end;
AdoQuery1.Close; {закроем датасет, он нам больше не нужен!}

во-вторых, в целях безопасности намного лучше в БД хранить не сами пароли,
а их цифровой оттиск - хеш-функцию (MD5 "с солью", например). Тогда пользователь-злоумышленник, получивший доступ к БД всё равно не сможет восстановить пароли и воспользоваться ими.
Блин, обрадовался.. а как попробовал применить, так сразу столкнулся с трудностями..
Как понимать AdoQuery1.Text ?
stevieg вне форума Ответить с цитированием
Старый 03.10.2012, 18:51   #5
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

небольшая опечатка у Сержа
Код:
AdoQuery1.SQL.Text
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 03.10.2012, 21:02   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Yurk@
небольшая опечатка у Сержа
точно так. спасибо. именно опечатался.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.10.2012, 05:51   #7
stevieg
Пользователь
 
Регистрация: 28.11.2011
Сообщений: 24
По умолчанию

Так, спасибо, с этим разобрался...
У меня еще два вопроса...
1. В таблице с пользователями у меня есть также поле Access level, которое как вы понимаете отвечает за уровень доступа, там имеют место быть всего два значение: Администратор и Пользователь, соответственно.
Вопрос: Что нужно добавить в процедуру авторизации пользователя, с которой вы мне помогли выше, чтобы проверялся также уровень доступа и в соответствии с типом (либо Администратор, либо Пользователь) после авторизации открывалась соответствующая форма (условно Form1 и Form2)?

2. У меня на форме, где расположена сама таблица пользователей, есть кнопка поиска по логину. Код следующий:
Код:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Users WHERE Login=LoginValue');
ADOQuery1.Parameters.ParamByName('LoginValue') .value:=Form_search.Edit1.text;
ADOQuery1.Active:=True;
except
on e:Exception do
end;
Вопрос: Ищет, с этим все хорошо.. находит - да.. Но как потом вернуть таблицу в исходное состояние?

Заранее спасибо.

Последний раз редактировалось stevieg; 04.10.2012 в 08:04.
stevieg вне форума Ответить с цитированием
Старый 04.10.2012, 09:10   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
1. В таблице с пользователями у меня есть также поле Access level, которое как вы понимаете отвечает за уровень доступа, там имеют место быть всего два значение: Администратор и Пользователь, соответственно.
ну, так выбираете нужное поле в select и анализируете его.
схематично так:
Код:
  AdoQuery1.SQL.Text := 'select ..., AccessLevel from PassTbl ......
....
  if AdoQuery1.RecordCount = 1 then begin
      iLevel := AdoQuery1.FieldByName('AccessLevel').AsInteger; {если это поле числовое - или AdoQuery1.FieldByName('AccessLevel').AsString - если поле строковое }
     if iLevel = constАдмин then ПоказатьFormАдмин
     else ПоказатьFormПользователь.
  end;

по 2-му вопросу.
Цитата:
Код:
ADOQuery1.SQL.Add('SELECT * FROM Users WHERE Login=LoginValue');
ADOQuery1.Parameters.ParamByName('LoginValue') .value:=Form_search.Edit1.text;
Ищет, с этим все хорошо.. находит - да..
Как это - "ищет" ?! o_O! У Вас же параметр в тексте не задан!!
должно быть
Код:
ADOQuery1.SQL.Add('SELECT * FROM Users WHERE Login=:LoginValue');
Или я что-то не знаю про DataSet'ы в Delphi ?!!


Цитата:
Но как потом вернуть таблицу в исходное состояние?
Это ЗАПРОС на получение данных. он ничего НЕ ИЗМЕНЯЕТ в исходной таблице(-ах).
Таблица в БД и её содержимое остаётся в исходном состоянии.
Что Вы имеете в виду под "вернуть таблицу в исходное состояние" ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.10.2012, 09:13   #9
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

1. это что-ли?
Код:
AdoQuery1.SQL.Text := 'select id, uName, Access_level from PassTbl where login=:LoginValue and passw=:PaswValue;
ADOQuery1.ParamByName('LoginValue') .Value:=Form_search.Edit1.text;
ADOQuery1.ParamByName('PaswValue') .Value:=Form_search.Edit2.text;
ADOQuery1.Active:=True;
Edit1.Text:=ADOQuery1.FieldByName('Access_level').Value;
2. простым запросом без параметров (или я не понял вопроса?)
Код:
ADOQuery1.SQL.Text:='SELECT * FROM Users';
UPD: опять у нас с Serge дежавю
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 04.10.2012 в 09:15.
Yurk@ вне форума Ответить с цитированием
Старый 04.10.2012, 09:26   #10
stevieg
Пользователь
 
Регистрация: 28.11.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Как это - "ищет" ?! o_O! У Вас же параметр в тексте не задан!!
должно быть
Код:
ADOQuery1.SQL.Add('SELECT * FROM Users WHERE Login=:LoginValue');
Или я что-то не знаю про DataSet'ы в Delphi ?!!
Забыл пояснить, LoginValue - это значение, которое я ввижу в Edit, как критерий поиска.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Это ЗАПРОС на получение данных. он ничего НЕ ИЗМЕНЯЕТ в исходной таблице(-ах).
Таблица в БД и её содержимое остаётся в исходном состоянии.
Что Вы имеете в виду под "вернуть таблицу в исходное состояние" ?!
То есть когда я сделал запрос на поиск определенной записи, в таблице будет отображаться только эта найденная запись. Я понимаю, что это только визуальное изменение, перезаписи таблицы как таковой не происходит, но как отменить это самое визуальное изменение потом?
Cancel не помогает.

И насчет первого вопроса, по поводу проверки уровня доступа при авторизации. Сделал как вы сказали, но теперь когда выполняю процедуру, говорит, что неверный логин /пароль. Какая то ошибка у меня в коде. Наведите на путь истинный
Код:
AdoQuery1.Close;
AdoQuery1.SQL.Text := 'select Login, Password, Access from Users '+      {Access - поле с правами доступа, то самое}
   ' where Login='+QuotedStr(Login.text)+
   ' and Password='+QuotedStr(Hash.Text)+
   ' and Access='+QuotedStr(AL.Text);     {AL - TEdit, куда помещается значение с поля Access, если я правильно понял и делать нужно именно так}
AdoQuery1.Open;
if  AdoQuery1.RecordCount = 0 then ShowMessage('Неверный логин/пароль.'
+#10#13+'Повторите попытку.')
  else if AdoQuery1.RecordCount = 1  then
      begin
      AL.text:= AdoQuery1.FieldByName('Access').AsString;
     if AL.text = 'Администратор' then Form_admin.Show
     else form_DB.show;
     ShowMessage('Вы вошли как '+AdoQuery1.FieldByName('Login').AsString);
ADoQuery1.Close;

Последний раз редактировалось stevieg; 04.10.2012 в 11:43.
stevieg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авторизация пользователя revaldo666 Microsoft Office Access 12 16.12.2012 00:29
Авторизация пользователя StudUL C++ Builder 13 06.06.2012 18:09
Авторизация пользователя в Делфи могилев БД в Delphi 9 12.05.2011 01:15
Авторизация пользователя mar4elo PHP 10 31.03.2011 19:28
авторизация и распознавание пользователя МаМи Microsoft Office Access 3 27.03.2010 21:03