2013-11-29 3 views
1

Как правильно обращаться? http://yiiframework.ru/doc/guide/en/topics.auth в разделе входа в систему на основе файлов cookie говорится, что это нехорошо хранить важную информацию в файлах cookie. И я тоже думаю. Они советуют сделать следующее:Yii cookie на основе входа

Когда пользователь успешно входит в заполнив регистрационную форму, мы генерировать и хранить случайный ключ как в состоянии печенья и постоянного хранения на стороне сервера (например, база данных). После последующего запроса , когда аутентификация пользователя выполняется через информацию cookie , мы сравниваем две копии этого случайного ключа и обеспечиваем соответствие перед входом в систему пользователя. Если пользователь снова войдет в систему с помощью формы входа , ключ необходимо повторно сгенерировать.

И я согласен. Но как это реализовать? Где мне нужно написать код, который будет проверять файл cookie и восстановить сеанс? Любой помощник или что? Или это должно быть перед функцией Render() контроллера? Есть ли учебники? Благодаря!

ответ

3

Аутентификация может быть достигнута с использованием сеансов или файлов cookie.

Чтобы включить аутентификацию на основе файлов cookie, задайте свойство пользователя allowAutoLogin.

В вашей защищены/конфиг/main.php

'components'=>array(
    'user'=>array(
     // enable cookie-based authentication 
     'allowAutoLogin'=>true, 
     'loginUrl'=>'site/login', 
     'class' => "UserIdentity", 
    ), 

При проверке подлинности учетных данных пользователя. установите период действия печенья, например:

Yii :: app() -> user-> login ($ identity, 3600 * 24 * 7); // Запомнить меня на неделю

EDIT

Вы можете хранить дополнительную информацию с помощью setSate

$this->setState('myhash', $myhash); 

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

Чтобы принудительно ввести значение в сеанс, используйте глобальный объект сеанса.

Yii::app()->session['hash'] = $hash; 

Чтобы заставить значение в печенье

Yii::app()->request->cookies['hash'] = new CHttpCookie('hash', $hash); 
+0

Да, я это знаю. Но я заметил, что в таком случае вся информация хранится в файле cookie. Например, электронная почта, is_admin и т. Д.И пользователи могут это изменить, не так ли? Как это сделать? Я не хочу хранить всю эту информацию. Я хочу сохранить только некоторые хэш .... Но где же тогда мне нужно написать код, который проверяет хэш и извлекает данные? – Volodymyr

+0

Смотрите мое обновление в сообщении выше. – crafter

+0

Спасибо! Не могли бы вы посоветовать мне, где я должен проверить хеш, полученный из файла cookie и получить информацию из базы данных, используя этот хеш? В каком методе? Благодарю. – Volodymyr

1

Ответ здесь: http://www.yiiframework.com/wiki/741/enhance-security-of-cookie-based-login/

Я добавлю, что вы должны указать в Params, что вы перекрытая CWebUser:

'user' => array(
    'class' => 'WebUser', 
    ...... 

И еще одна важная вещь, этот cookie сеанса не будет установлен, если не указан Yii::app()->user->login() второй параметр (время жизни cookie).

Смежные вопросы