PDA

View Full Version : سوال: يوزرها را محدود به يك بار ورود در يك زمان كنيم



لوک خوش شانس
یک شنبه 06 اردیبهشت 1388, 13:03 عصر
با سلام

من يه مشكل در ASP كلاسيك دارم به اين ترتيب :
يه سايت طراحي شده كه براي وارد شدن به بخش ادمين يوزرهاي مختلفي داره . هر يوزر كه وارد ميشه يه Session ايجاد ميكه كه اعتبار يوزر در صفحات مختلف با اون شناسايي ميشه . اگر همان يوزر از كامپيوتر ديگه اي وارد بشه دوباره سيستم اجازه ورود ميده . چكار كنم كه يوزر فقط با يه كامپيوتر بتونه وارد بشه و تا وقتي كه از سيستم خارج نشده يوزر ديگه اي با همان مشخصات نتونه وارد بشه .

kashaneh
یک شنبه 06 اردیبهشت 1388, 18:54 عصر
دوست عزیز شما می توانید در رکورد مربوط به هر کاربر (User) خود در بانک اطلاعاتی، فیلدی داشته باشید (مثلا از نوع بولین با نام login) که هنگام ورود با آن مشخصات کاربری، علاوه بر چک کردن نام کاربری و رمز، مقدار این فیلد هم بررسی شود که اگر Trueبود یعنی در حال حاضر با این مشخصات لاگینی صورت گرفته و اجازه ورود مجدد داده نشود... هنگام logout مقدار آن فیلد را false کنید تا برای ورود های بعدی مشکلی پیش نیاید... موفق باشی

لوک خوش شانس
دوشنبه 07 اردیبهشت 1388, 16:56 عصر
دوست عزیز شما می توانید در رکورد مربوط به هر کاربر (User) خود در بانک اطلاعاتی، فیلدی داشته باشید (مثلا از نوع بولین با نام login) که هنگام ورود با آن مشخصات کاربری، علاوه بر چک کردن نام کاربری و رمز، مقدار این فیلد هم بررسی شود که اگر Trueبود یعنی در حال حاضر با این مشخصات لاگینی صورت گرفته و اجازه ورود مجدد داده نشود... هنگام logout مقدار آن فیلد را false کنید تا برای ورود های بعدی مشکلی پیش نیاید... موفق باشی

با تشکر از پاسخ شما

در این صورت دو مشکلی پیش می آید :
1- اگر یوزر بدون logout کردن خارج شود آن موقع دیگر امکان ورود ندارد .
2- اگر زمان Session به اتمام برسد بازهم یوزر امکام ورود ندارد .

من فکر می کنم باید از متد Application در فایل Global.asa استفاده کنیم ولی طریقه استفاده رو نمی دونم .

kashaneh
سه شنبه 08 اردیبهشت 1388, 18:08 عصر
دوست عزیز راه حل این مشکل هم آسان است... شما کافی است در فایل Global.asa خود در هنگام رخ دادن متد Session_OnEnd یعنی اتمام یکی از Session ها، چک کنید که اگر مقدار این Session مربوط به لاگین همچنان True است، اولا مقدار فیلد مربوط به آنرا در بانک اطلاعاتی False کنید و ثانیا کل محتوای آن Session را با Abandon حذف کنید (گرچه به طور اتوماتیک وار عمل دوم اجرا خواهد شد)... موفق باشی

لوک خوش شانس
سه شنبه 08 اردیبهشت 1388, 20:20 عصر
با تشکر

آقا مثالی در این مورد میتونی به من معرفی کنی که ببینم چطور اینو اجراییش کرده ؟
ببین من به Session دارم به نام UserName که یوزرها رو بعد از وارد شدن در UserName قرار میدم .
وقتی که یوزر وارد میشه درون بانک یه فیلدی که مربوط یه ON یا OFF یوزرهاست رو ON یا True می کنه . چطوری اینو داخل برنامه چک کنم که اجازه ورود به یوزرها رو برای بار دوم نده و بدون Logout کردن هم اتومات زیربرنامه مورد نظر از فایل Global اجرا بشه تا فیلد مربوطه رو False کنه ؟


من مشکلم همینه که نمی تونم این قسمت رو بنویسم .

kashaneh
چهارشنبه 09 اردیبهشت 1388, 20:04 عصر
دوست عزیز برای مثال فرض کنید نام فیلد شما Islogin باشد... حال کاربر قصد لاگین دارد... او نام کاربری و رمز عبور را وارد می کند... شما علاوه بر چک کردن هر دو این مقادیر، باید مقدار مربوط به فیلد Islogin هم چک کنید تا ببینید کسی با این نام کاربری الان وارد شده یا خیر؟ پس کوئری شما از بانک اطلاعاتی چیزی شبیه این می شود:


Select * From TblUSERS Where UserName=My User Name And Password=My Password And Islogin=False
مقدار False در کوئری فوق چک می کند آیا کاربر مورد نظر لاگین کرده یا خیر (False یعنی خیر)... پس از لاگین هم باید مقدار این فیلد را True کنید تا دیگر با این نام کاربری کسی مجدد نتواند وارد شود تا هنگام خروج وی یا اتمام مدت زمان اعتبار Session آن کاربر...


در مورد خروج کاربر یا اتمام Session آن هم در فایلی با نام global.asa در هنگام رویداد Session_OnEnd باید مجدد به بانک اطلاعاتی متصل شوید و مقدار فیلد Islogin که الان با ورود کاربر True شده را به False تغییر دهیم... تقریبا به اینصورت (کد نویسی مفصل تر به عهده خود شما) :



<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
......
Change Value Of Field Islogin To False For Youe Username In DataBase
......
End Sub
</SCRIPT>

موفق باشی

لوک خوش شانس
پنج شنبه 10 اردیبهشت 1388, 12:42 عصر
با تشکر از پاسخ شما


این طوری عمل کنم درست میشه ؟



<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
Select * From TblUSERS Where UserName=Session("My_User_Name")
Set rs = Server.CreateObject("ADODB.Recordset")
rs.CursorLocation = 2
rs.Open sSql, conn, 1, 2

rs("Islogin") = True

rs.Close
Set rs = Nothing
End Sub
</SCRIPT>

kashaneh
پنج شنبه 10 اردیبهشت 1388, 21:19 عصر
دوست عزیز مقدار Islogin را باید False کنید نه True!!

کاری که باید انجام دهید تقریبا معادل همین کدی است که نوشتید... من به صورت شبه کد نوشتم اما حتما می دانید که در هنگام پیاده سازی، باید ریزه کاریها و دستور زبان را به دقت رعایت کنید... مثلا شما بعد از اینکه مقدار فیلد را false کردید، از دستور rs.UPDATE استفاده نکرده اید و این یعنی خطا در انجام کار!!!... با کمی دقت حتما موفق خواهید شد... موفق باشی

لوک خوش شانس
یک شنبه 13 اردیبهشت 1388, 10:42 صبح
ممنون عزیزم

آره فرمایش شما کاملاً دسته من اینو به صورت ناقص گزاشتم . البته که باید کدهای ذخیره سازی در دیتابیس کامل باشه تا برنامه عمل کنه .

از توجه شما ممنونم

لوک خوش شانس
پنج شنبه 04 تیر 1388, 19:02 عصر
دوست عزیز برای مثال فرض کنید نام فیلد شما Islogin باشد... حال کاربر قصد لاگین دارد... او نام کاربری و رمز عبور را وارد می کند... شما علاوه بر چک کردن هر دو این مقادیر، باید مقدار مربوط به فیلد Islogin هم چک کنید تا ببینید کسی با این نام کاربری الان وارد شده یا خیر؟ پس کوئری شما از بانک اطلاعاتی چیزی شبیه این می شود:


Select * From TblUSERS Where UserName=My User Name And Password=My Password And Islogin=False
مقدار False در کوئری فوق چک می کند آیا کاربر مورد نظر لاگین کرده یا خیر (False یعنی خیر)... پس از لاگین هم باید مقدار این فیلد را True کنید تا دیگر با این نام کاربری کسی مجدد نتواند وارد شود تا هنگام خروج وی یا اتمام مدت زمان اعتبار Session آن کاربر...


در مورد خروج کاربر یا اتمام Session آن هم در فایلی با نام global.asa در هنگام رویداد Session_OnEnd باید مجدد به بانک اطلاعاتی متصل شوید و مقدار فیلد Islogin که الان با ورود کاربر True شده را به False تغییر دهیم... تقریبا به اینصورت (کد نویسی مفصل تر به عهده خود شما) :



<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
......
Change Value Of Field Islogin To False For Youe Username In DataBase
......
End Sub
</SCRIPT>

موفق باشی

با سالام
من با این برنامه نتونستم کاربران Online رو شناسایی کنم .
مشکل کار اینه که در فایل Global.asa مقدار Sesstion ی که در فایل ها به آن مقدار دادیم رو قبول نمی کنه . یعنی نمیشه متوجه شد که کدام کاربر در حال حاضر از سایت خارج شده که مقدار Islogin رو False کرد .
آیا در فایل های ASP می شود به یک متغییر Application مقدار داد ؟ و آن را در فایل Global بازخانی و از آن استفاده کرد ؟

kashaneh
جمعه 05 تیر 1388, 09:35 صبح
دوست عزیز در مورد اینکه می توان از متغیر های Application استفاده کرد باید بگم بله می تواید اما باید از این متغیر ها حتی الامکان کم استفاده کرد...
در مورد اینکه نمی توانید کاربران آنلاین را شناسایی کنید باید بگم بله اگر کسی مثلا دکمه خروج را نزند و از سایت برود در مدت کوتاهی (چون بعد از مدتی Session آن از بین می رود) تعداد کاربران آنلاین شما کمی زیادتر خواهد بود ولی بعد از انقضای Session او، دوباره تعداد صحیح خواهد شد... و به نظر من این قابل چشم پوشی است!! موفق باشی

لوک خوش شانس
جمعه 05 تیر 1388, 11:27 صبح
دوست من ،مشكل اينه كه چطوري session ي كه براي هر يوزر در Golobal ايجاد شده رو تشخيص بدم.

خيلي ساده بگم .
سايت تعدادي كاربر معمولي بدون يوزر داره و تعدادي هم با يوزر و پس وارد ميشن . بعد از ورود زيربرنامه اي كاربر رو شناسايي ميكنه و مشخصات اونو از جمله نام - سطح دسترسي - نام كاربري و ... رو در چند Session ميريزه كه در تمام صفحات بتونيم ازش استفاده كنيم .
خوب حالا شما بفرماييد كه چگونه مي توان مقداري كه به Session("UserName") اختصاص داده شده رو داخل Application("UserName") بريزيم . يعني مقدار هردو يكي بشوند .

آقا اين برنامه اي كه براي شناسايي كاربران در Global دادي كار نمي كنه . امكان ارسال يه شناسه يا متغير به Global از داخل فايل ASP نيست . يا من نميدونم چطور ؟:متفکر:

kashaneh
شنبه 06 تیر 1388, 12:46 عصر
دوست عزیز چرا میگین امکان پذیر نیست!؟ هنگام اجرای یک روتین Session_OnEnd براحتی شما وقتی نام کاربری کاربران عضو خودتونو دارید می تونید فیلد مربوط به لاگین شدن وی را False کنید تا بعدا بتونه مجدد وارد بشه...
کدی که من گذاشتم بله شبه کد هست و نباید هم اجرا بشه... کاربران غیر عضو شما هم که مطمئنا نام کاربری ندارند و اصلا نیازی به عملیات خاصی ندارید...
لطفا اگر مشکلی هست اونو دقیقتر بگید... شاید هم برداشت من صحیح نباشه... به هر حال موفق باشی

لوک خوش شانس
شنبه 06 تیر 1388, 14:37 عصر
آره فرمایش شما درسته . بزار اینطوری بگم :

یوزر از طریق یه صفحه ASP وارد میشه . یوزر نیم اونو هم داریم Session("My_User_Name")
. خوب حالا چطوری در روتین Session_OnEnd از این یوزرنیم استفاده کنیم که بتونیم فیلد مربوط به لاگین شدن رو False کنم ؟

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
...............
Select * From TblUSERS Where UserName=Session("My_User_Name")
...............
End Sub
</SCRIPT>

Session("My_User_Name") رو نمیشناسه

kashaneh
شنبه 06 تیر 1388, 18:05 عصر
دوست عزیز اگر از انجام همه چیز مطمئن هستید ولی بازهم نمی توانید مقدار متغیر از نوع Session را بخوانید، مطمئن شوید که فایل Global.asa شما در شاخه root قرار گرفته باشد (بالاترین سطح و در واقع اولین شاخه ای که توسط IIS به عنوان شاخه اصلی شناسایی می شود)...
در ضمن مطالعه لینک زیر خالی از لطف نیست :

http://www.w3schools.com/ASP/asp_globalasa.asp

موفق باشی

لوک خوش شانس
شنبه 06 تیر 1388, 20:19 عصر
ممنون از این که با حوصله جواب میدی کاشانه جان ....
فایل Global در شاخه روت قرار داره ، چون من دارم ازش استفاده می کنم و تعداد کاربران Online روی سایت رو میشمرم .
برنامه من اینه

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



Sub Session_OnEnd
x_ID = Session("UserID")
Set rsUserOn = Server.CreateObject("ADODB.Recordset")
rsUserOn.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("Menu/Main.mdb") & ";Jet OLEDB:Database Password=lks;"
rsUserOn.Source = "SELECT * FROM TUsers where ID=" + Replace(x_ID, "'", "''") + ""
rsUserOn.CursorLocation = 2
rsUserOn.LockType = 2
rsUserOn.Open()
rsUserOn("TOnline") = False
rsUserOn.Update
rsUserOn.Close
Set rsUserOn = Nothing


End Sub

kashaneh
یک شنبه 07 تیر 1388, 13:33 عصر
دوست عزیز برای خود منم یک سوال اساسی پیش اومده... شما یک امتحانی انجام بده... سعی کن ID کاربران رو فعلا در یک جدولی در بانک اطلاعاتی ذخیره کنی و هیچ کار دیگه ای نکنی... منظورم اینه در هنگام انقراض یک Session، سعی کنید به جای False کردن فیلد کاربر، آن ID رو در جدولی ذخیره کنید...
هدفم از این کار این است که تست شود آیا اصلا این مقادیر هنگام رخ دادن زمان انقراض Session، قابل دستیابی هستند یا خیر... اگر شما دیدی مقادیری در جدول شما ذخیره می شود که خبر خوبی است!! اگر نه باید بگردید دنبال راه حلی دیگر برای مقصود خود...

منتظر نتیجه آزمایش و تست شما هستم.... موفق باشی

لوک خوش شانس
یک شنبه 07 تیر 1388, 18:30 عصر
ممنون

امتحان می کنم و نتیجه رو اینجا میزارم

لوک خوش شانس
سه شنبه 16 تیر 1388, 08:49 صبح
سلام

آقا این کار کرد . فکر می کنم از ویندوزم بود مشکل از برنامه نبود .

بهرحال ممنون عزیز