Sök…


Anmärkningar

Cookies är en del av HTTP-förfrågan så det är en bra idé att göra både i controller som ansvar exakt hanterar begäran och svar.

För att ställa in en cookie, dvs för att skapa den och schema för att skicka till webbläsaren, måste du skapa en ny \yii\web\Cookie klassinstans och lägga till den i svarskakasamlingen:

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

I ovanstående överför vi parametrar till konstruktören för cookie class. Dessa är i princip samma som används med infödd PHP setcookie- funktion:

  • name - kakans namn.
  • value - värdet på kakan. Se till att det är en sträng. Webbläsare är vanligtvis inte nöjda med binära data i kakor.
  • domain - domän du ställer in cookien för.
  • expire - unix tidsstämpel som anger tid när cookien ska raderas automatiskt.
  • path - sökvägen på servern där cookien kommer att finnas tillgänglig på.
  • secure - om det är true kommer cookie bara att ställas in om HTTPS används.
  • httpOnly - om det är true kommer cookie inte att vara tillgänglig via JavaScript.

För att läsa en cookie använder du följande kod:

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

Obs! Den här koden tillåter lästa cookies som har ställts in med cookie-komponenten (eftersom den som standard undertecknar alla cookies). Om du lägger till / uppdaterar cookie med JS-kod kan du därför inte läsa den med den här metoden (som standard).

Cookies för underdomäner

På grund av säkerhetsskäl är kakor som standard bara tillgängliga på samma domän som de ställts in från. Om du till exempel har ställt in en cookie på domän example.com kan du inte få den på domän www.example.com . Så om du planerar att använda underdomäner (dvs. admin.example.com, profile.example.com), måste du ange domain uttryckligen:

$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 cookie läsas från alla underdomäner på example.com .

Autentiserings- och identitetskakor över tvärdomäner

I fallet med autologin eller "kom ihåg mig" -kakan gäller samma gränser som för underdomänskakor. Men den här gången måste du konfigurera användarkomponent, ställa in identityCookie array till önskad cookie-konfigurering.

Öppna din programkonfigurationsfil och lägg till parametrar för identityCookie i konfigurationen av användarkomponenter:

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

    ],
];

Observera att cookieValidationKey ska vara densamma för alla underdomäner.

Observera att du måste konfigurera egenskapen session::cookieParams att ha samedomainen som din user::identityCookie att säkerställa login och logout för alla underdomäner. Detta beteende förklaras bättre i nästa avsnitt.

Parametrar för sessionskakor är viktiga både om du har ett behov av att underhålla sessionen medan du kommer från ett underdomän till ett annat eller när du tvärtom är värd för backend-appen under /admin URL och vill hantera sessionen separat.

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow