Значения сессий перезаписываются при доступе нескольких пользователей в YII

Я работаю над функциональностью «Забыли пароль», используя YII Framework. Поток как таковой ->

На странице входа есть ссылка «Забыли пароль». При щелчке по нему отображается новое представление, в котором пользователю необходимо указать свой адрес электронной почты. Почта доставляется на почтовый идентификатор, и в этом письме предоставляется ссылка, при нажатии которой пользователь будет перенаправлен на страницу «СБРОС пароля», где он может установить новый пароль.

Я работаю с Сессиями для выполнения этого сценария. Проблема состоит в том, что Сессия перезаписывается, и только последний введенный Адрес EMAIL (Пользователь) может СБРОСИТЬ пароль (при попытке ввода Множественных идентификаторов EMAIL один за другим).

1) Во-первых, я начал сеанс после нажатия кнопки «Отправить». Случайная строка сохраняется в сеансе и отправляется на EMAIL. Когда пользователь щелкает ссылку сброса, открывается страница СБРОС, и если строка соответствует строке сеанса, пароль можно сбросить.

Все это прекрасно работает, если работал только с одним EMAil. если я ввожу два идентификатора электронной почты .. Я получаю почту на Оба с сгенерированной ссылкой сброса ,,,, но когда я нажимаю на ссылку сброса первого идентификатора почты ,,, я получаю сообщение об ошибке, где, когда я нажимаю полученную ссылку сброса во втором почтовом адресе ,, тогда это работает.

public function actionForgotPassword()
{
$model = new ForgotPasswordForm;
$userModel = new UserDetails;

if(isset($_POST['ForgotPasswordForm']))
{
$model->attributes = $_POST['ForgotPasswordForm'];

// validate user input and redirect to the previous page if valid
if($model->validate())
{
$getMail = $_POST['ForgotPasswordForm']['email'];
$user = UserDetails::model()->findByAttributes(array(
'email' => $getMail
));

if($user)
{
session_start();

$sessionString = $model-> genRandomSaltString();
Yii::app()->session['identityString'] = $sessionString;
///Below is the MAIL function
}
}}}

Код на СБРОС ПАГ

public function actionNewPassword()
{
session_start();
$model = new ChangePasswordForm;
$userModel = new UserDetails;
$email = Yii::app()->request->getParam('tag');
$getSessionKey = Yii::app()->request->getParam('key');
//print_r($_SESSION);die;
$catchSessionValue = Yii::app()->session['identityString'];
if(!empty($_SESSION) && !empty($catchSessionValue))
{
if($catchSessionValue == $getSessionKey && $email !== null)
{

$user_arr = UserDetails::model()->findByAttributes(array('email' => $email));
$user_name = $user_arr['username'];
$user_id = $user_arr['id'];

Yii::app()->user->setFlash('info', "Enter your New Password here.");
if(isset($_POST['ChangePasswordForm']))
{
$this->render('changepassword',array('change_pw_form'=>$model,'user'=>$user_arr));
}
else{
$this->render('changepassword',array('change_pw_form'=>$model,'user'=>$user_arr));
}

}
else
{
Yii::app()->user->setFlash('error', "Something went Wrong. Try Again!");
$this->render('changepassword');
//$this->redirect(Yii::app()->createUrl('site/login'));
}

}
else
{
$user_arr = UserDetails::model()->findByAttributes(array('email' => $email));
Yii::app()->user->setFlash('error', "Sorry ! The link has been expired. Please try again.");
$this->render('changepassword',array('change_pw_form'=>$model,'user'=>$user_arr));
//   $this->redirect(Yii::app()->createUrl('site/login'));
}
}

0

Решение

Вы переопределяете значение снова и снова, и, следовательно, только последнее письмо 'identityString' хранится.

Зачем?

Для одного и того же «сеанса браузера» (то есть вы не закрывали браузер или не открывали страницу в другом браузере), сеанс остается тем же. (Если явно не уничтожено в вашем PHP-коде)

И пока сессия остается прежней, вы фактически отменяете 'identityString' значение сеанса каждый раз. Это означает, что случайная строка, сгенерированная при отправке первого письма, переопределяется случайной строкой, сгенерированной при отправке второго письма. Вот почему вы не получаете ошибку во втором.

Сеансы в этом случае бесполезны, поскольку сохраняемые вами значения становятся недоступными, когда пользователь закрывает свой браузер или использует другой браузер или устройство, чтобы щелкнуть ссылку в письме.

Вы бы хранили такую ​​информацию в базе данных или в кеше. Если вы не хотите использовать БД, файловые кеши доступны в Yii. использование Yii::app()->cache->set($id, $value); куда $id может быть уникальной строкой, сгенерированной из адреса электронной почты пользователя и $value это $sessionString

Пример:

$id = 'identityString.'.md5($getEmail);
// 'identityString.9e107d9d372bb6826bd81d3542a419d6'
Yii::app()->cache->set($id, $sessionString);

И вы получите это снова:

$id = 'identityString.'.md5($email);
$catchSessionValue = Yii::app()->cache->get($id);

И вот простое объяснение того, как работают сессии:

Всякий раз, когда сеанс инициализируется на вашем сервере, браузер сохраняет cookie сеанса с уникальным значением. Этот cookie передается с каждым запросом к вашему серверу с тех пор. Уникальное значение используется для идентификации сеанса, и сервер извлекает все переменные, инициализированные для этого сеанса.
Браузер теряет cookie сеанса, когда он закрыт, и, следовательно, доступ к этому сеансу теряется.

Кроме того, другой пользователь stackoverflow написал это, пройдитесь по нему:
http://machinesaredigging.com/2013/10/29/how-does-a-web-session-work/

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]