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', ], ], ], ];