|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Реализация авторизации в приложении
Ребят, помогите пожалуйста статейкой или книжкой где адекватно даётся мат.часть по авторизации пользователей в программе с использованием (хранением учётных записей) БД. Говно-код, вроде того, что проверяет данные в InputBox на этапе инициализации Application не предлагать
Общая идея, я так понял, выглядит так: Код:
MainForm.OnCreate with TFormLogin.Create(self) do try if вызов метода Auth, который возвращает true\false при авторизации then не знаю что тут писать. По идее ничего, просто пропустить к методу Free; else а если авторизация не прошла как адекватно пропустить к методу Free, и при этом закрыть MainForm? finally Free; end; Код:
Result := false; While not Result do if ShowModal = mrOK if возможно связаться с удалённой БД then if данные совпадают then Result := True else по идее нужно добавить какой-то счётчик на количество попыток Возникают следующие вопросы: а если к БД не будет доступа, что тогда? Пользователь не сможет работать с программой?) В каком виде хранить пароли в БД? Cash какого-нибудь RSA(пароль) и сравнивать тогда уже только хеши? Последний раз редактировалось Uniq!, 17.07.2014 в 09:51. |
#2
|
||||
|
||||
Цитата:
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#3
|
||||
|
||||
Цитата:
Я правильно понимаю, что можно воспользоваться APIшными функциями самой винды, чтоб создать Хеш? |
#5
|
||||
|
||||
Цитата:
Вот MSDN-ссылка Ну и статья по теме: Delphi и Windows API для защиты секретов |
Этот пользователь сказал Спасибо Uniq! за это полезное сообщение: | ||
Freeman (18.07.2014)
|
#6
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#7
|
||||
|
||||
Цитата:
Что касается хеширования - пароль можно сначала посолить, а потом уже посчитать хеш. jmp $ ; Happy End! The Cake Is A Lie. |
#8
|
||||
|
||||
Что касается шифров - я понял. Хромает архитектура.
Код:
procedure TFormMain.FormCreate(Sender: TObject); begin with TFormLogin.Create(Self) do try if not Authorization(Users) then // Users - это DataSet с информацией о всех пользователях, хранимых в БД Halt; finally Free; end; end; После HALT - сыпятся ошибки доступа к памяти. Я понимаю, что это очень жёсткое прерыванием процедуры Чем заменить? Если Application.Terminate, то форма успевает "мигнуть", не по феншую В самом методе Authorization я предполагаю: Код:
while Result <> true do Result := ShowModal = mrOK // пока нажимают ОК (пытаясь войти) if Users.Locate('Login;Cash', VarArrayOf([edLogin.Text, edCash.Text]), []) then // если нашёлся, тогда выходим из цикла, возвращаем true Result := true; end; От идеи с уже открытым окном и кнопкой авторизации пришлось отказаться в силу "указаний руководства". Не хотят показывать даже GUI программы. Последний раз редактировалось Uniq!, 22.07.2014 в 15:32. |
#9
|
||||
|
||||
Может прописать это в коде самого проекта, до создания форм?
jmp $ ; Happy End! The Cake Is A Lie. |
#10
|
||||
|
||||
Цитата:
Код:
begin ... Application.ShowMainForm := False; ... end; Не стоит путать форумы с богадельнями. © Bargest |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
Uniq! (23.07.2014)
|
#11
|
||||
|
||||
Код:
Application.ShowMainForm := False; Код:
function TFormLogin.Authorization(Users: TADOTable): boolean; begin dsUsers.DataSet := Users; repeat if ShowModal = mrOK then begin if dsUsers.DataSet.Locate('Login;Cash', VarArrayOf([edLogin.Text, edCash.Text]), []) then begin dsUsers.DataSet.Edit; if cbRememberMe.Checked = true then Users.FieldByName('Remember').AsInteger := 1; dsUsers.DataSet.FieldByName('LoginDate').AsDateTime := Now; dsUsers.DataSet.Post; Result := true; end else begin edCash.Clear; if edLogin.Text = '' then edLogin.SetFocus else edCash.SetFocus; end; end else Break; until Result = true; end; Т.е. я как делаю: повторять попытки входа, пока пользователь жмёт ok. Как только ShowModal не равен mrOK цикл прерывается и вываливается с Result = False; что влечёт за собой Terminate. Не нравится "break". Может как-то без этого можно обойтись? |
#12
|
||||
|
||||
Код:
while (not result) and (showmodal = mrok) do jmp $ ; Happy End! The Cake Is A Lie. |