![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Цитата:
![]() Цитата:
|
|
#3
|
||||
|
||||
|
Цитата:
Я правильно понимаю, что можно воспользоваться APIшными функциями самой винды, чтоб создать Хеш? |
|
#4
|
||||
|
||||
|
А есть такие? В исходниках Indy вроде самопал какой-то.
|
|
#5
|
||||
|
||||
|
Цитата:
Вот MSDN-ссылка Ну и статья по теме: Delphi и Windows API для защиты секретов |
| Этот пользователь сказал Спасибо Uniq! за это полезное сообщение: | ||
Freeman (18.07.2014)
| ||
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
Цитата:
Что касается хеширования - пароль можно сначала посолить, а потом уже посчитать хеш. |
|
#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
|
||||
|
||||
|
Может прописать это в коде самого проекта, до создания форм?
|
|
#10
|
||||
|
||||
|
Цитата:
Код:
begin ... Application.ShowMainForm := False; ... end; |
| Этот пользователь сказал Спасибо 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 |