مشکل با تغییر رمز و عمل کردن کوکی با رمز قبلی

[rtl]سلام

من امروز با یه چیز عجیب روبرو شدم

اگر کاربری تیک گزینه مرابه خاطر بسپار رو زده باشه و کوکی احراز هویت ایجاد شده باشه

و کاربر بخواد رمز رو تغییر بده ( اگر خروج رو نزده باشه ) هنوز هم می تونه با اون کوکی لاگین کنه از این لحاظ دچار مشکل هست که کاربری که قبلا روی یک سیستم لاگین کرده بود و کوکی براش ست شده اگر بخواد رمز رو تغییر بده تا از سیستم قبلی کسی نتونه لاگین کنه , نمی تونه کاری بکنه

کسی راه حلی برای این موضوع داره[/rtl]

[right]فکر کنم بتونید بعد از اینکه تعویض پسوورد رو انجام داد یوزر بعد از انجام عملیات logout کنید که دوباره لوگین کنه[/right]

[rtl]بزارید یه مثال بزنم

فرض کنید کاربری میاد تو سیستم A لاگین می کنه فریم ورک میاد فایل کوکی رو ست می کنه

بعد کاربر می خواد تو سیستم B رمز عبورش رو تغییر بده بعد از این که تغییر داد ( چه خروج رو بزنه و جه نزنه )

باز هم کاربر می تونه با استفاده از سیستم A لاگین کنه ( بدون رمز جید و با استفاده از همون کوکی که قبلا ایجاد شده )

الان مشکل اینجاست که نباید همچین اتفاقی بیفته[/rtl]

[right][rtl][font="Tahoma"]

سلام

بله این مشکلی که شما میگید فکر کنم وجود داره، منم تا به حال بهش فکر نکرده بودم!

دو تا راه حل به ذهن من میرسه، اولی اینکه اصلا اجازه اینکه کاربر روی چند تا ماشین با کوکی لاگین کنه رو ندیم. خود مستندات فریمورک یه راهی پیشنهاد میده که نتیجه ثانوی اش همین میشه. کاربر وقتی روی یک ماشین جدید کوکی رو ست میکنه، کوکی های قبلی نامعتبر میشه و با اونها لاگین نمیشه کرد. اینجا رو بخونید.

راه دوم هم این هست که تاریخچه ماشین هایی که کاربر روشون لاگین کرده و گزینه لاگین با کوکی رو هم فعال کرده رو نگه داریم. یه چیزی شبیه به گوگل ک به شما میگه روی چند تا ماشین گزینه مرا به خاطر بسپار رو فعال کردید. این روش پیش نیازش تکنیک پاراگراف قبلی هست با این تفاوت که هر ماشین randomLoginKey مخصوص به خودش رو داره و قاعدتا نیاز به یک جدول دیگه واسه ذخیره سازی این اطلاعات داریم. اینطوری اگر مثلا پسورد تغییر کرد، میشه کاری کرد کوکی های همه ماشین های قبلی نامعتبر شناخته شند

کلا اما فکر کنم همون روش اول واسه بیشتر سایت ها کفایت میکنه، فوقش کاربر مجبور میشه دوباره لاگین کنه دیکه! مگه اینکه جز نیازمندی های سایتتون صریحا ذکر شده باشه که میخوام مثه گوگل چند جا پسوردم ذخیره باشه :)

[/font][/rtl][/right]

[rtl][font="Tahoma"]ما در پروژه ای با این موضوع برخورد داشتیم که شبیه کارهایی که دوستان گفتند عمل کردیم.

یعنی باید از CDbHttpSession استفاده بشه (و نه از CHttpSession) که باید یک تیبل برای اون ایجاد بشه و راهنمای فعالسازی اون اینجاست:

http://www.yiiframework.com/doc/api/1.1/CDbHttpSession

و بعد از تعویض پسورد سشن رو از بین میبرید:

Yii::app()->session->destroy();

[/font][/rtl]