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.

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 - se true , il cookie verrà impostato solo se si utilizza HTTPS.
  • httpOnly : se è true , il cookie non sarà disponibile tramite JavaScript.

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).

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 .

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.

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow