在 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",
],
],
],
我的网站有一个根域和几个子域,每个子域都有一个单独的 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",
],
],
],