PDA

View Full Version : سوال: فرم لاگیــــن ( ورود به نرم افزار )



djhooman
یک شنبه 20 آذر 1390, 00:06 صبح
سلام دوستان ...

واقعا از همه دوستان ممنونم چون برنامه نویسی یاد گرفتن رو من از این فروم یاد گرفتم ...

من خیلی وقته دارم رو بخش های پیاده سازی نرم افزار ها کار میکنم که یاد بگیرم چجوری باید کار کنم ...

یه سوال در مورد فورم لاگین دارم :

بطور فرض من دیتابیس SQL دارم و اسم جدول کاربرانم User هست ...
جدول هم شامل فبلدهای ID ( Primary Key ) , Username , Password , UserType , Permission هستش ...
دوتا فرم هم توی برنامه دارم . فرم اولی فرم لاگین و فرم دومی main form ام هستش ...
حالا میخوام بدونم چگونه میتونم اول از همه بیام چک کنم یوزر و پسورد وارد شده در فرم 1 ، در دیتابیس هست یا نه ( اطلاعات وارد شده صحیح است با خیر ) ، اگر صحیح نبود که اررور بده ، اگر صحیح بود بیاد نوع Permission رو چک کنه ...
جالا ما نوع Permission رو به سه دسته تقسیم می کنیم ...
1 - مدیر کل ( دسترسی به تمام فرم ها )
2 - مدیر داخلی ( دسترسی به فرم ثبت اطلاعات و ویرایش اطلاعات )
3 - کاربر ( دسترسی به فرم ثبت اطلاعات )
برای گزینه های 1 تا 3 ، متغیرهایی تعریف بشه که اگر Permission = Admin بود فرم باز بشه ، اگر Permission = Local Admin بود ، فرم ثبت و ویرایش فعال باشه و کاربر هم فرم ثبت اطلاعات ...
حالا با توجه به Enable و Disable کردن ToolStripMenu سطوح دسترسی داده شود و فرم ها متناسب به کاربر نمایش داده شود ...

اگر سورسی تو این مورد دارید دریغ نکنید ...

اگر هم کدی دارید بگذارید تا یاد بگیریم ....

djhooman
یک شنبه 20 آذر 1390, 19:47 عصر
کسی حاظر نیست کمک کنه ؟؟؟؟

mgh64120
یک شنبه 20 آذر 1390, 23:30 عصر
سلام دوست عزيز

حالا میخوام بدونم چگونه میتونم اول از همه بیام چک کنم یوزر و پسورد وارد شده در فرم 1 ، در دیتابیس هست یا نه ( اطلاعات وارد شده صحیح است با خیر ) ، اگر صحیح نبود که اررور بده
Dim Cnn As New SqlConnection("رشته اتصال")
Dim Cmd As SqlCommand
Dim ResultUser As Object
Dim ResultPass As Object
'
Cmd = New SqlCommand("SELECT Count(*) FROM User WHERE Username = " & txtUsername.Text, Cnn)
Try
Cnn.Open()
ResultUser = Cmd.ExecuteScalar
Select Case Val(ResultUser)
Case 0
MessageBox.Show("كد كاربر در سيستم موجود نيست.")
Case 1
Cmd = New SqlCommand("SELECT Password FROM User WHERE UserName = " & txtUsername.text , Cnn)
ResultPass = Cmd.ExecuteScalar
If CType(ResultPass,String) = txtPassword.Text Then
frmMain.Show
Else
MessageBox.Show("رمز عبور را صحيح وارد نمائيد")
txtPassword.Select()
End If
End SELECT
Catch ex As Exception
MessageBox.Show(ex.Message, "خطا")
End Try

موفق باشيد...

djhooman
دوشنبه 21 آذر 1390, 23:25 عصر
کد رو گذاشتم اما کد اررور داره توی این قسمت :

If CType(ResultPass,"String") = txtPassword.Text Then

عکس رو پیوست کردم

mgh64120
دوشنبه 21 آذر 1390, 23:49 عصر
سلام دوست عزيز
معذرت ميخوام عبارت "String" رو بدون كوتيشن بنويس يعني String
موفق باشيد

djhooman
دوشنبه 21 آذر 1390, 23:58 عصر
این کار هم کردم اما درست نشد

تیبل User رو بدلیل اینکه تداخل متغیرهای ثابت پیش نیاد رو به Users تغییر دادم ... طبق فایل پیوست ارور میده ....

توی تیبل Users ، یه یوزرنیم همینجوری ایجاد کردم به نام Hooman و پسورد 123 ....

djhooman
سه شنبه 22 آذر 1390, 00:06 صبح
در ضمن از درست بودن این کد مطمنی ؟

Case 1 Cmd = New SqlCommand("SELECT Password FROM User WHERE UserName = " & txtUsername.text , Cnn)

دستور انتخاب پسورد از تیبل یوزر و پیداکردن یوزر اگر با تکست باکس یوزرنیم یکی بود ؟

mgh64120
سه شنبه 22 آذر 1390, 00:18 صبح
در ضمن از درست بودن این کد مطمنی ؟

Case 1 Cmd = New SqlCommand("SELECT Password FROM User WHERE UserName = " & txtUsername.text , Cnn)

دستور انتخاب پسورد از تیبل یوزر و پیداکردن یوزر اگر با تکست باکس یوزرنیم یکی بود ؟

اره درسته. فقط اگر نوع داده(DataType) فيلد پسورد از نوع رشته هست بجاي عملگر مساوي از عملگر Like استفاده كن.


توی تیبل Users ، یه یوزرنیم همینجوری ایجاد کردم به نام Hooman و پسورد 123 ....
معني كه از متن پيغام خطا به نظر من مياد اينه كه نوشته نام فيلد Hamoon معتبر نيست.
اگه ممكنه ساختار جدول Users رو بزار.
موفق باشيد...

djhooman
سه شنبه 22 آذر 1390, 00:24 صبح
یعنی این خط رو :
Case 1 Cmd = New SqlCommand("SELECT Password FROM User WHERE UserName = " & txtUsername.text , Cnn)

به :

Case 1 Cmd = New SqlCommand("SELECT Password FROM User WHERE UserName like " & txtUsername.text , Cnn)

تبدیل کنم ؟؟؟

alimanam
سه شنبه 22 آذر 1390, 12:36 عصر
با سلام

یک پروژه نمونه واستون نوشتم میتونی الگو بگیری .

نکته :

فیلد Permission به نظر من اضافی هستش .

تذکرات :

حتما برای دیتابیس یک پسورد بگذارید
حتما نام کاربری و پسورد رو به صورت کد شده در دیتابیس ذخیره کنید
همیشه از دیتابیس های مطمئن استفاده کنید که به نظر من اکسس زیاد از این نظر مطمئن نیست


من در این مثال از دیتابیس اکسس استفاده کردم ( به دلیل مشکلاتی که دیتابیس های SQL روی سیستم من پیدا کردن نمیتونستم با دیتابیس sql واستون مثال بنویسم )

موفق باشید ./

djhooman
سه شنبه 22 آذر 1390, 14:14 عصر
مرسی از لطفت علی جان ،

اما کدهای رویداد کلیک و فانکشن رو کپی کردم و تنظیمات کانکشن و فیلدای خودم رو گذاشتم و اون یرویرتی فرم اصلی هم توی فرم اصلی گذاشتم ...
دیتابیس ام هم چند تا یوزر تعریف کردم...اما باز اررور میده
اول اررور : Specified Case Is Not Valid و بعدش هم "کاربری با مشخصات فوق وجود ندارد" رو میده ...

کدی که تغییر دادمش اینه :

اول از همه Function :

Private Function CheckuserExist(ByVal id As String, ByVal pass As String) As Boolean
Try
cnn = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
Dim cmd As New SqlCommand("select Username,Password,UserType from Users", cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()

Dim reader As SqlDataReader
reader = cmd.ExecuteReader

Dim value As Boolean = False
While reader.Read
If id = reader.GetString(0).Trim And pass = reader.GetString(1).Trim Then
usertype = reader.GetInt32(2)
value = True
Exit While
End If
End While
cnn.Close()
Return value

Catch ex As Exception
MsgBox(ex.Message)
Return False
End Try

End Function


و باتن تایید هم :




Private Sub OK_Click(sender As System.Object, e As System.EventArgs) Handles OK.Click

Dim FormAsli As New MainForm
If CheckuserExist(Usernametxt.Text, Passwordtxt.Text) Then
Me.Hide()
FormAsli.UserType = usertype
FormAsli.Show()
Else
MsgBox("کاربری با مشخصات فوق وجود ندارد", MsgBoxStyle.Exclamation)
End If


End Sub

djhooman
سه شنبه 22 آذر 1390, 14:19 عصر
مرسی از لطفت علی جان ،

اما کدهای رویداد کلیک و فانکشن رو کپی کردم و تنظیمات کانکشن و فیلدای خودم رو گذاشتم و اون یرویرتی فرم اصلی هم توی فرم اصلی گذاشتم ...
دیتابیس ام هم چند تا یوزر تعریف کردم...اما باز اررور میده
اول اررور : Specified Case Is Not Valid و بعدش هم "کاربری با مشخصات فوق وجود ندارد" رو میده ...

کدی که تغییر دادمش اینه :

اول از همه Function :

Private Function CheckuserExist(ByVal id As String, ByVal pass As String) As Boolean
Try
cnn = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
Dim cmd As New SqlCommand("select Username,Password,UserType from Users", cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()

Dim reader As SqlDataReader
reader = cmd.ExecuteReader

Dim value As Boolean = False
While reader.Read
If id = reader.GetString(0).Trim And pass = reader.GetString(1).Trim Then
usertype = reader.GetInt32(2)
value = True
Exit While
End If
End While
cnn.Close()
Return value

Catch ex As Exception
MsgBox(ex.Message)
Return False
End Try

End Function


و باتن تایید هم :




Private Sub OK_Click(sender As System.Object, e As System.EventArgs) Handles OK.Click

Dim FormAsli As New MainForm
If CheckuserExist(Usernametxt.Text, Passwordtxt.Text) Then
Me.Hide()
FormAsli.UserType = usertype
FormAsli.Show()
Else
MsgBox("کاربری با مشخصات فوق وجود ندارد", MsgBoxStyle.Exclamation)
End If


End Sub

alimanam
سه شنبه 22 آذر 1390, 14:34 عصر
شما Try رو از فانکشن حذف کن بعد ببین کدوم خط رو Error میگیره ؟

djhooman
سه شنبه 22 آذر 1390, 14:52 عصر
Catch ex As Exception و اررور میگیره

mgh64120
سه شنبه 22 آذر 1390, 16:56 عصر
سلام دوست عزيز
براي حذف دستور Try بايد كل اون رو حذف كني كه شامل Try و Catch ex As Exception و EndTry.
يعني :

Private Function CheckuserExist(ByVal id As String, ByVal pass As String) As Boolean
cnn = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\Database.mdf;Integrated Security=True;Connect Timeout=30;UserInstance=True")
Dim cmd As New SqlCommand("select Username,Password,UserType from Users", cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()
Dim reader As SqlDataReader
reader = cmd.ExecuteReader
'
Dim value As Boolean = False
While reader.Read
If id = reader.GetString(0).Trim And pass = reader.GetString(1).Trim Then
usertype = reader.GetInt32(2)
value = True
Exit While
End If
End While
cnn.Close()
'
Return value
End Function


موفق باشيد...

djhooman
سه شنبه 22 آذر 1390, 17:32 عصر
پاک کردم ... بازهم اررور میده میگه که کاربری با این یوزرنیم وجود ندارد ...

درحالی که دیتابیسم 10-12 تا یوزر ایجاد کردم :(:(:(

alimanam
سه شنبه 22 آذر 1390, 18:59 عصر
با سلام

به ظاهر که نباید باگ داشته باشه اون دوستانی که زحمت دانلود به خودشون رو دادن حداقل به این دوستمون کمک کنن بگن مشکل مشابه دارن یا نه ؟ البته کدها رو برای بانک SQL تغییر بدین چون من نمیتونم این کار رو انجام بدم و تست کنم سیستمم فعلاً مشکل داره .

موفق باشید ./

djhooman
سه شنبه 22 آذر 1390, 20:54 عصر
کسی نیست کمک کنه ؟؟؟

nasiiiiiii
سه شنبه 22 آذر 1390, 21:09 عصر
وست عزیز میشه درباره(حتما نام کاربری و پسورد رو به صورت کد شده در دیتابیس ذخیره کنید )یه توضیح مفصل بدین:خجالت:

djhooman
چهارشنبه 23 آذر 1390, 19:52 عصر
کسی نیست ؟؟؟

alimanam
جمعه 25 آذر 1390, 00:36 صبح
با سلام


وست عزیز میشه درباره(حتما نام کاربری و پسورد رو به صورت کد شده در دیتابیس ذخیره کنید )یه توضیح مفصل بدین

خوب منظورم Encrypt و Decrypt کردن پسورد و نام کاربری بود که مثلا اگه کسی به دیتابیس نفوذ کرد چیز خاصی رو به دستش نرسیده باشه . البته بهترین روش 100 مطمئن Hash کردن پسورد هستش که دیگه به هیچ عنوان قابل برگشت به رشته ابتدایی نباشه . میدونم که شما توضیح مفصل خواستین که از بنده به دلیل وقت کم نمیتونم ارائه بدم شما میتونی در گوگل یا در همین سایت در مورد روش ها و الگوریتم های رایج کد کردن رشته ها سرچ کنی اگه با سرچ کردن و کمی مطالعه بازم چیزی دستگیرت نشد سعی میکنم بیشتر توضیح بدم .


کسی نیست ؟؟؟

دوست عزیز شما با سورسی که بهت دادم ( پایگاه داده اکسس ) مشکلی نداشتی درسته ؟ وقتی کدها رو برای sql عوض میکنی مشکل دار میشه ؟ من راهنمایی کردم گفتم که باید Try و مابقی کدهایی که برای کنترل Exception ها هست رو برداری تا دقیقا بدونم در کدوم خط از کد Bug تولید میشه .

موفق باشید ./

JAMAL.R
چهارشنبه 07 دی 1390, 23:55 عصر
سلام من راهنمایی هایی که دوستان کردند رو نخوندم ولی واسه چند پروژه سیستم کاربری رو این طور طراحی کردم :
جدول user شامل فیلدهای :
u_name : نام کاربری
u_pass : گذرواژه
u_range : رنج یا سطح دسترسی کاربر که این فیلد عددی رو به عنوان رنج کاربر در خود ذخیره میکنه مثلا سطح دسترسی 1 مدیر سیستم تلقی میشه به همه قسمت ها دسترسی داره یا مثلا سطح دسترسی 4 فقط میتونه به زیر سیستم فروش دسترسی داشته باشه و ...
برای چک کردن درستی نام کاربری و گذرواژه دستور sql به صورت زیر میشه :
"Select * From user where u_name= '" + txt_username.Text + "' and u_pass=' " + txt_password.Text + "'"

بعد باید بگیم اگه در دیتاست سطری موجود بود وارد فرم اصلی بشه در واقع این حالت زمانی رخ میده که نام کاربری و گذر واژه درست باشه (توی جدول موجود باشه ) دستورش شبیه زیر میشه :
if (ds.Tables["tbl"].Rows.Count != 0)
{
user_range = Convert.ToInt32(ds.Tables["tbl"].Rows[0]["u_range"].ToString());
frm_lmain fm = new frm_main();

fm.Show();




}
else
{
MessageBox.Show("نام کاربری یا گذرواژه اشتباه است", "خطا", MessageBoxButtons.OK,MessageBoxIcon.Asterisk);

}

سطری که درشت تر تایپکردم رنج کاربر رو داخل یک متغیر عمومی (public static ) میریزه همونطور که میدونید این متغیر ها همه جای برنامه قابل استفاده اند فقط کافیه اسم فرم رو بنویسید و نقطه تا نمایششون بده که تو این برنامه میشه : frm_login.user_range
حالا کافیه تو فرم مورد نظر با خوندن مقدار این متغیر به کاربر دسترسی های دلخواه بدید.
امیدوارم مفید بوده باشه