yii2
Biscotti
Ricerca…
Osservazioni
I cookie fanno parte della richiesta HTTP, quindi è una buona idea fare entrambe le cose nel controller, la cui responsabilità è esattamente quella che riguarda la richiesta e la risposta.
Impostazione di un cookie
Per impostare un cookie, ad esempio per crearlo e pianificare l'invio al browser, è necessario creare una nuova istanza di classe \yii\web\Cookie e aggiungerla alla raccolta dei cookie di risposta:
$cookie = new Cookie([
'name' => 'cookie_monster',
'value' => 'Me want cookie!',
'expire' => time() + 86400 * 365,
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);
In quanto sopra passiamo i parametri al costruttore della classe cookie. Questi sono praticamente gli stessi usati con la funzione setcookie PHP nativa :
-
name- nome del cookie. -
value- valore del cookie. Assicurati che sia una stringa. I browser non sono generalmente contenti dei dati binari nei cookie. -
domain- dominio per il quale stai impostando il cookie. -
expire- unix timestamp che indica l'ora in cui il cookie deve essere automaticamente cancellato. -
path: il percorso sul server in cui sarà disponibile il cookie. -
secure- setrue, il cookie verrà impostato solo se si utilizza HTTPS. -
httpOnly: se ètrue, il cookie non sarà disponibile tramite JavaScript.
Leggere un cookie
Per leggere un cookie utilizzare il seguente codice:
$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');
Nota: questo codice consente di leggere i cookie che sono stati impostati utilizzando il componente cookie (poiché per impostazione predefinita firma tutti i cookie). Pertanto se aggiungi / aggiorni cookie usando il codice JS, non puoi leggerlo usando questo metodo (di default).
Cookie per sottodomini
Per motivi di sicurezza, i cookie di default sono accessibili solo sullo stesso dominio da cui sono stati impostati. Ad esempio, se hai impostato un cookie su domain example.com , non puoi ottenerlo sul dominio www.example.com . Pertanto, se hai intenzione di utilizzare sottodomini (ad esempio admin.example.com, profile.example.com), devi impostare il domain esplicito:
$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);
Ora i cookie possono essere letti da tutti i sottodomini di example.com .
Autenticazione cross-subdominio e cookie di identità
In caso di autologin o cookie "ricordami", si applicano le stesse stranezze come nel caso dei cookie di sottodominio. Ma questa volta è necessario configurare il componente utente, impostando l'array identityCookie sulla configurazione dei cookie desiderata.
Apri il file di configurazione dell'applicazione e aggiungi i parametri identityCookie alla configurazione del componente utente:
$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,
],
],
],
];
Nota che cookieValidationKey dovrebbe essere lo stesso per tutti i sottodomini.
Nota che devi configurare la proprietà session::cookieParams per avere il samedomain come user::identityCookie per garantire il login e il logout per tutti i sottodomini. Questo comportamento è spiegato meglio nella prossima sezione.
Parametri del cookie di sessione
I parametri dei cookie di sessione sono importanti sia se si ha la necessità di mantenere la sessione mentre si passa da un sottodominio a un altro o quando, al contrario, si ospita l'app di back-end sotto /admin URL e si desidera gestire separatamente la sessione.
$config = [
// ...
'components' => [
// ...
'session' => [
'name' => 'admin_session',
'cookieParams' => [
'httpOnly' => true,
'path' => '/admin',
],
],
],
];