Zoeken…


Opmerkingen

Cookies maken deel uit van HTTP-verzoek, dus het is een goed idee om zowel in de controller te doen welke verantwoordelijkheid precies betrekking heeft op verzoek en antwoord.

Om een cookie in te stellen, dwz om het te maken en te plannen voor verzending naar de browser, moet u een nieuw \yii\web\Cookie klasse maken en toevoegen aan de verzameling van responscookies:

$cookie = new Cookie([
    'name' => 'cookie_monster',
    'value' => 'Me want cookie!',
    'expire' => time() + 86400 * 365,
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);

In het bovenstaande geven we parameters door aan de constructeur van de cookieklasse. Deze zijn in principe hetzelfde als gebruikt met de native PHP setcookie- functie:

  • name - naam van de cookie.
  • value - waarde van de cookie. Zorg ervoor dat het een string is. Browsers zijn meestal niet blij met binaire gegevens in cookies.
  • domain - domein waarvoor u de cookie instelt.
  • expire - Unix-tijdstempel die aangeeft wanneer de cookie automatisch moet worden verwijderd.
  • path - het pad op de server waarop de cookie beschikbaar zal zijn.
  • secure - indien true , wordt cookie alleen ingesteld als HTTPS wordt gebruikt.
  • httpOnly - indien true , is cookie niet beschikbaar via JavaScript.

Gebruik de volgende code om een cookie te lezen:

$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');

Opmerking: met deze code kunnen cookies worden gelezen die zijn ingesteld met behulp van de cookie-component (omdat deze standaard alle cookies ondertekent). Daarom als u cookie toevoegt / bijwerkt met behulp van JS-code, kunt u deze niet lezen met deze methode (standaard).

Cookies voor subdomeinen

Om veiligheidsredenen zijn cookies standaard alleen toegankelijk op hetzelfde domein als waar ze zijn ingesteld. Als u bijvoorbeeld een cookie heeft ingesteld op domein example.com , kunt u deze niet krijgen op domein www.example.com . Dus als u van plan bent om subdomeinen te gebruiken (bijv. Admin.example.com, profile.example.com), moet u het domain expliciet instellen:

$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);

Nu kan de cookie worden gelezen van alle subdomeinen van example.com .

Cross-subdomein authenticatie en identiteitscookies

In het geval van autologin of "onthoud mij" -cookie gelden dezelfde eigenaardigheden als in het geval van subdomein-cookies. Maar deze keer moet u de gebruikerscomponent configureren en de identityCookie array instellen op de gewenste cookie-configuratie.

Open het configuratiebestand van uw applicatie en voeg de parameters identityCookie aan de configuratie van gebruikerscomponenten:

$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,
            ],
        ],

    ],
];

Merk op dat cookieValidationKey hetzelfde moet zijn voor alle subdomeinen.

Merk op dat u de eigenschap session::cookieParams moet configureren om session::cookieParams domein te hebben als uw user::identityCookie om ervoor te zorgen dat de login en logout werken voor alle subdomeinen. Dit gedrag wordt beter uitgelegd in de volgende sectie.

Parameters van sessiecookies zijn belangrijk, zowel als u de sessie wilt onderhouden terwijl u van het ene subdomein naar het andere gaat, of wanneer u daarentegen een backend-app host onder /admin URL en de sessie afzonderlijk wilt afhandelen.

$config = [
    // ...
    'components' => [
        // ...
        'session' => [
            'name' => 'admin_session',
            'cookieParams' => [
                'httpOnly' => true,
                'path' => '/admin',
            ],
        ],
    ],
];


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow