ورود

View Full Version : سوال: کد فرم login با entity framework



firoozi90
جمعه 05 اسفند 1390, 12:33 عصر
دوستان من برای فرم لاگینی که طراحی می کنم از این کد استفاده می کنم.گفتم توی این تایپیک قرار بدم شاید بدردتون بخوره و اینکه عیب هاشو بگید تا بتونیم به کمک هم به یه کد حرفه ای برسیم

ابتدا یه کلاس ایجاد کردم و تابع checkuser را درونش نوشتم


public bool checkuser(string st1, string st2)
{
user u = new user();

int n=db.user.Where(p => p.id == st1 && p.pass == st2).Count();

if (n == 0)
return false;
else
return true;


}




بعد در رویداد کلیک دکمه فراخوانیش می کنیم


string st1 = textBox1.Text;
string st2 = textBox2.Text;
if (st1 == "" || st2 == "")
{
label3.Text = "لطفا اطلاعات کامل وارد کنید";
return;
}

user u=new user();
if (u.checkuser(st1, st2))
{
this.Close();
Form1.flag = true;

}
else
{
label3.Text = "نام کاربری و پسور اشتباه شد";
Form1.flag = false;
}

mehdi.mousavi
شنبه 06 اسفند 1390, 11:41 صبح
سلام.
احتمالا شما تاپیک "گفتگوی فنی شماره یک، اصول و قواعد کد نویسی (http://barnamenevis.org/showthread.php?224704-%DA%AF%D9%81%D8%AA%DA%AF%D9%88%DB%8C-%D9%81%D9%86%DB%8C-%D8%B4%D9%85%D8%A7%D8%B1%D9%87-%DB%8C%DA%A9-%D8%A7%D8%B5%D9%88%D9%84-%D9%88-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C)" رو ندیده اید. کد ارسالی شما حاوی ایرادهای بزرگی هستش که در اینجا، به برخی از اونها اشاره می کنم:


نام گذاری متغیرها اصلا صحیح نیست. label3 هیچگونه اطلاعاتی در مورد اینکه اون label قراره چه چیزی رو نمایش بده به من نمیده. همینطور هستش st1، st2 و ... به همین ترتیب، نام user بعنوان کلاسی برای انجام عملیات DAL، اصلا نام قابل قبولی نیست.
نوشتن String Literal ها بدین شکل در کد، کار Localization رو تقریبا غیر ممکن میکنه. لطفا برای اطلاعات بیشتر در این مورد، کلمه Localization رو در Google جستجو کنید.
استفاده از Count برای مشاهده اینکه UID/PWD مورد نظر شما در بانک وجود داره یا خیر، صحیح نیست. LINQ ای که شما نوشته اید، ابتدا کلیه Record هایی رو که ID/PWD اونها، همون زوجی هستش که شما بدنبالش هستید رو به Client میاره، سپس تعداد رکوردها رو با صفر مقایسه میکنه. در صورتیکه این وظیفه Any هستش. به بیان دیگه، کدتون رو باید بدین شکل تغییر بدید تا فقط یک Boolean به سمت Client برگرده، اینکه User ای با مشخصات ذکر شده وجود داره یا نداره. bool exists = db.user.Where(p => p.id == st1 && p.pass == st2).Any();
کد شما، نشون میده که کلمه عبور رو بصورت Clear در بانک نگهداری کرده اید. این مساله ایرادهای امنیتی فراوانی میتونه در پی داشته باشه که قبلا بارها در بخش های مختلف سایت به اون اشاره کرده ام. کلمات عبور رو نباید بصورت Clear در بانک نگهداری کرد، بلکه باید Hash اونها رو در بانک نگهداری کنید و Hash Code مربوطه رو با Hash نگهداری شده در بانک مقایسه کنید (در نوشته های من جستجو کنید، قبل در این مورد توضیحات مفصلی داده ام).
بنظر میرسه که کدهای UI و DAL رو سعی کرده اید از هم جدا کنید و تابع checkuser رو در کلاس user تعریف کرده اید. این حرکت خوبه، اما سبک نام گذاری شما باعث شده تا نشه این مساله رو بلافاصله متوجه شد. بیشترین چیزی که به نظر من به کد شما آسیب رسونده، عدم رعایت الگوهای استاندارد نامگذاری در برنامه نویسی هستش. بنابراین، عدم نام گذاری صحیح متغیرها رو برای بار دوم نیز ذکر می کنم. این مساله در خوانایی کد شما بسیار تاثیر داره.
بنظر میرسه، شما دارید از Flag ای در کلاس فرم، برای اطلاع کلاس بیرونی از نتیجه وضعیت Login استفاده می کنید. روش صحیح انجام اینکار، استفاده از DialogResult و مقادیر مربوطه اون برای مطلع کردن Caller هستش، نه اینکه Flag ای برای خودتون تعریف کنید و ...

موفق باشید.

mohammadreza110
جمعه 11 مرداد 1392, 02:10 صبح
خیلی ممنون خیلی کمکم کردی

mreram
جمعه 07 شهریور 1393, 01:01 صبح
سلام دوستان کسی میتونه در تعیین سطح دسترسی کاربران کمکم کنه؟؟ بابت کد لاگین هم خیلی ممنون:لبخندساده: