在 Yii2 中自动登录多个域

Automagically Log into Multiple Domains in Yii2

我的网站有一个根域和几个子域,每个子域都有一个单独的 yii2 模块。目前我必须单独登录每个子域。我希望能够登录到根目录,然后自动登录到每个子域。网上有几页关于实现此目的的信息,但没有任何效果。

目前我在两个 main.php 配置文件(即根域和我正在测试的子域之一)中有相同的设置

'components' => [
    'request' => [
        'enableCookieValidation' => true,
        'enableCsrfValidation' => true,
        'cookieValidationKey' => 'XXXXXXX',
    ],
    'user' => [
        'class' => 'yii\web\User',
        'identityClass' => 'common\models\User',
        'enableAutoLogin' => true,
        'identityCookie' => [
            'name' => '_myapp',
            'httpOnly' => true,
            'path' => '/',
        ]
    ],
    'session' => [
        'name' => 'MYAPPSESSID',
        'cookieParams' => [
            'path' => '/',
        ],
    ],

使用设置登录后在 Chrome 检查我的 cookie 时,我看到两个 cookie,一个用于主站点,一个用于子域,它们都称为 MYAPPSESSID,并且都包含不同的 'keys' 大概连接到 PHP 会话中设置的用户信息。我知道这两个 cookie 应该是一个 cookie,以便两个域都连接到会话用户对象 - 但我已经尝试了所有我能想到的不同设置,但无法让它工作。

我终于想通了。 session->cookieParams 需要在两个 main.php 配置文件上设置 'domain',这是以“.”为前缀的顶级域名。我确实尝试过这个,但没有生成 cookie,事实证明这是因为我在 Mamp Pro 中设置的本地域没有按照 cookie 期望的方式格式化。所以我的应用程序在 http://myapp, and http://subdomain.myapp. It turns out that the cookie domain setting requires a top level domain (like .com). So I changed my hosts to http://myapp.local and http://subdomain.myapp.local。然后我将 cookie 域设置为 .myapp.local 并且它起作用了。

这是我的新配置,它在根域和子域上。顺便说一下,上面的 user->identityCookie 设置结果是不必要的。

'components' => [
'request' => [
    'enableCookieValidation' => true,
    'enableCsrfValidation' => true,
    'cookieValidationKey' => 'XXXXXXX',
],
'user' => [
    'class' => 'yii\web\User',
    'identityClass' => 'common\models\User',
    'enableAutoLogin' => true
],
'session' => [
    'name' => 'MYAPPSESSID',
    'cookieParams' => [
        'path' => '/',
        'domain' => '.myapp.local'
    ],
],

要能够登录所有子域,请使用以下配置:

'components' => [
    'session' => [
        // ...
        'cookieParams' => [
            'path' => '/',
            'domain' => ".domain.com",
        ],
    ],
    'user' => [
        // ...
        'identityCookie' => [
            'name' => '_identity',
            'path' => '/',
            'domain' => ".domain.com",
        ],
    ],
    'request' => [
        // ...
        'csrfCookie' => [
            'name' => '_csrf',
            'path' => '/',
            'domain' => ".domain.com",
        ],
    ],
],