yii2
Печенье
Поиск…
замечания
Куки-файлы являются частью HTTP-запроса, поэтому неплохо сделать и то, и другое в контроллере, ответственность за который точно связана с запросом и ответом.
Настройка файла cookie
Чтобы установить файл cookie, т. Е. Создать его и запланировать отправку в браузер, вам нужно создать новый экземпляр класса \yii\web\Cookie
и добавить его в коллекцию файлов ответов:
$cookie = new Cookie([ 'name' => 'cookie_monster', 'value' => 'Me want cookie!', 'expire' => time() + 86400 * 365, ]); \Yii::$app->getResponse()->getCookies()->add($cookie);
В приведенном выше примере мы передаем параметры конструктору класса cookie. Они в основном такие же, как и с встроенной функцией setcookie PHP:
-
name
- имя файла cookie. -
value
- значение cookie. Убедитесь, что это строка. Браузеры обычно недовольны двоичными данными в файлах cookie. -
domain
- домен, для которого вы настраиваете cookie. -
expire
- отметка времени unix, указывающая время, когда файл cookie должен быть автоматически удален. -
path
- путь на сервере, на котором будет доступен cookie. -
secure
- еслиtrue
, cookie будет установлен только в том случае, если используется HTTPS. -
httpOnly
- еслиtrue
, cookie будет недоступен через JavaScript.
Чтение файла cookie
Чтобы прочитать файл cookie, используйте следующий код:
$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');
Примечание. Этот код позволяет читать файлы cookie, которые были установлены с использованием компонента cookie (поскольку он по умолчанию определяет все файлы cookie). Поэтому, если вы добавляете / обновляете cookie с использованием JS-кода, вы не можете его прочитать с помощью этого метода (по умолчанию).
Куки для субдоменов
Из-за соображений безопасности куки-файлы по умолчанию доступны только в том же домене, из которого они были установлены. Например, если вы установили cookie на домен example.com
, вы не можете получить его в домене www.example.com
. Поэтому, если вы планируете использовать субдомены (например, admin.example.com, profile.example.com), вам необходимо явно указать domain
:
$cookie = new Cookie([ 'name' => 'cookie_monster', 'value' => 'Me want cookie everywhere!', 'expire' => time() + 86400 * 365, 'domain' => '.example.com' // <<<=== HERE ]); \Yii::$app->getResponse()->getCookies()->add($cookie);
Теперь cookie можно прочитать из всех поддоменов example.com
.
Кросс-субдоменная аутентификация и файлы cookie идентичности
В случае автологина или «помнить меня» cookie применяются те же причуды, что и в случае куки-субдомена. Но на этот раз вам нужно настроить пользовательский компонент, установив массив identityCookie
в желаемую конфигурацию cookie.
Откройте файл конфигурации приложения и добавьте параметры identityCookie
в конфигурацию пользовательских компонентов:
$config = [ // ... 'components' => [ // ... 'user' => [ 'class' => 'yii\web\User', 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, 'loginUrl' => '/user/login', 'identityCookie' => [ // <---- here! 'name' => '_identity', 'httpOnly' => true, 'domain' => '.example.com', ], ], 'request' => [ 'cookieValidationKey' => 'your_validation_key' ], 'session' => [ 'cookieParams' => [ 'domain' => '.example.com', 'httpOnly' => true, ], ], ], ];
Обратите внимание, что cookieValidationKey
должен быть одинаковым для всех поддоменов.
Обратите внимание, что вам необходимо настроить свойство session::cookieParams
чтобы иметь samedomain как ваш user::identityCookie
чтобы обеспечить работу login
и logout
для всех поддоменов. Такое поведение лучше поясняется в следующем разделе.
Параметры cookie сеанса
Параметры cookie сеанса важны как в том случае, если вам нужно поддерживать сеанс при получении от одного субдомена к другому, либо, если наоборот, вы размещаете backend-приложение под /admin
URL и хотите обрабатывать сеанс отдельно.
$config = [ // ... 'components' => [ // ... 'session' => [ 'name' => 'admin_session', 'cookieParams' => [ 'httpOnly' => true, 'path' => '/admin', ], ], ], ];