PDA

View Full Version : تشخیص login مضاعف



zman123456
شنبه 09 آبان 1388, 20:10 عصر
با سلام
در مورد فرم login سوالات زیادی ارسال شده و پاسخ هایی هم داده شده.
به نظر من یکی از مواردی که در بحث login وجود داره تشخیص ورود مجدد کاربر به برنامه است.(در برخی از برنامه ها می بایست جلوی این کار را گرفت-البته میشه این قابلیت را در همه نرم افزارها قرار داد).
معمولا بعد از تشخیص کاربر سیستم کاربر مورد نظر را برای ورود مجدد lock میکنه و زمانی که کاربر از سیستم خارج (logoff) کرد سیستم کاربر را unlock میکنه.
حالا سوال اینجا پیش می آید که اگر برای سیستم مشکلی پیش بیاید و سیستم قابلیت unlock کاربر را نداشته باشد (مثل restart شدن یا هر چیز دیگر که سیستم به صورت طبیعی امکان انجام امور از آن سلب گردد) کاربر چگونه وارد سیستم شود؟
چون در این زمینه کمی تحقیق کردم و کدنویسی انجام دادم گفتم این تجربه اندک را در اختیار دیگر دوستان نیز قرار بدم.
1- برای lock و unlock کردن کاربر کافیست یک flag از نوع bit در جدول user قرار بدید.
2- در هنگام ورود بعد از صحت ورود نام کاربری و رمز عبور کافیست این flag را به 1 تغییر دهید.
** این مرحله اگر به تنهایی انجام بگیرد همان مشکلی که در بالا اشاره کردم به وقوع می پیوندد.
راه حل : ترکیب flag با یک نوع اطلاعات دیگر از کاربر.
3- یکی از اطلاعات سیستمی کاربر را در یکی دیگر از فیلدهای اطلاعاتی جدول کاربران قرار دهید.من به شخصه از ip سیستم کاربر استفاده می کنم.نام فیلد = UserIP
البته میشه از اطلاعات سیستمی دیگر مثل سریال هارد ، مادربورد و ... استفاده کرد ولی این اطلاعات با احتمال 2% قابلیت تغییر دارد.
** استفاده از ip کاربر این امکان را به admin می دهد که بتواند متخلف را به راحتی ردیابی کند.
*** باز این نحوه تشخیص دارای اشکالاتی است پس یک قابلیت دیگر را به سیستم اضافه می کنیم.
4- اقزودن قابلیت "عدم اجرای برنامه به تعداد بیشتر از یکبار"
این قابلیت با قرار دادن کد زیر در program به برنامه افزوده می شود:


Var Mutex : THandle;
begin
Mutex:=CreateMutex(nil,False,'OneCopyMutex');
if WaitForSingleObject(Mutex,0) <> wait_TimeOut then
begin
Application.Initialize;
Application.Title := 'LoginLearning';
Application.CreateForm(TF_Main_Fm, F_Main_Fm);
Application.Run;
end;
showmessage('امکان اجرای بیش از یکبار نرم افزار را ندارید.');
end.

البته یادتان نرود که Windows را use کنید.
می توان کد بخش تشخیص lock بودن کاربر را اینگونه در نظر گرفت:



if (Q_User.FieldByName('Lock').AsBoolean) And (Q_User.FieldByName(',UserIP').AsString <> GetLocalIPWithIndyMisc) then
begin
Show_Error();
end
else
begin
Q_Lock.Close;
Q_Lock.SQL.Clear;
Q_Lock.SQL.Add('UPDATE Users');
Q_Lock.SQL.Add('SET Lock = 1');
Q_Lock.SQL.Add(', UserIP = '+QuotedStr(GetLocalIPWithIndyMisc));
Q_Lock.SQL.Add('WHERE (UserCode = '+UserCode+')');
Q_Lock.ExecSQL;

.
.
.

به جای عبارت show_error می توانید پیغام خطای مناسبی قرار دهید.
5- در هنگام خروج از برنامه باید کاربر را Unlock کرد.


procedure TF_Main_Fm.FormDestroy(Sender: TObject);
begin
if DM_Con.Abort = 0 then //yani enseraf nazade.
begin
Q_Temp.Close;
Q_Temp.SQL.Clear;
Q_Temp.SQL.Add('UPDATE Priv_Users');
Q_Temp.SQL.Add('SET LU = 0');
Q_Temp.SQL.Add(', UIP = 0');
Q_Temp.SQL.Add('WHERE (UserCode = '+DM_Con.UserCode+')');
Q_Temp.ExecSQL;
end;
end;

همانطور که مشاهده می کنید این کد را در FormDestroy قرار می دهیم تا در هنگام خروج از برنامه کاربر به حالت unlock برود.
امیدوارم این آموزش برای دوستان کاربردی باشد.
فی امان ا...