CakePHP将会话从主域保持到子域

时间:2012-05-09 15:50:03

标签: session cakephp authentication

我正在使用Cakephp,我遇到了跨子域维护会话的问题。我的问题如下:

  • 用户登录'localhost / login'
  • 如果经过身份验证,则会将其重定向到“customer.localhost / home”。

目前,Cake正在为每个域创建一个cookie,即localhost和customer.localhost。 这意味着我无法保持会话为用户工作。有没有办法让所有cookie域固定到父域,目的是保持会话跨子域工作?

我试过在我的引导程序中输入它但它没有效果: ini_set('session.cookie_domain','。localhost');

如果您认为无法做到这一点,请随时告诉我,以便我可以从这个令人沮丧的问题继续前进。

非常感谢,

kSeudo

2 个答案:

答案 0 :(得分:16)

会话(CakePHP 2.x):

要使会话Cookie对所有子域和顶级域有效,您实际上需要在APP/config/bootstrap.php文件中自行设置:

ini_set('session.cookie_domain', '.domain.com');

然后,在您的APP/config/core.php文件中,将Security设置为low:

Configure::write('Security.level', 'low');
  

“否则referer_check将被设置为当前的HTTP_HOST   CakeSession对象行441。“

会话(CakePHP 3.x)

  

会话cookie路径默认为app的基本路径。要改变这一点   你可以使用session.cookie_path ini值。例如,如果你想   您的会话将在您可以执行的所有子域中保留:

Configure::write('Session', [
    'defaults' => 'php',
    'ini' => [
        'session.cookie_path' => '/',
        'session.cookie_domain' => '.yourdomain.com'
    ]
]);


Cookie(CakePHP 2.x):

this page上,它解释了您可以使用'domain'变量:

  

允许访问cookie的域名。   例如使用'.yourdomain.com'允许从您的所有子域进行访问。

根据他们的示例代码:

<?php
public $components = array('Cookie');
public function beforeFilter() {
    parent::beforeFilter();
    $this->Cookie->name = 'baker_id';
    $this->Cookie->time =  3600;  // or '1 hour'
    $this->Cookie->path = '/bakers/preferences/';
    $this->Cookie->domain = 'example.com';
    $this->Cookie->secure = true;  // i.e. only sent if using secure HTTPS
    $this->Cookie->key = 'qSI232qs*&sXOw!';
    $this->Cookie->httpOnly = true;
}

Cookie(CakePHP 3.x):

Read here

  

Cookie可用的域。使cookie可用   在example.com的所有子域上将域设置为'.example.com'。

答案 1 :(得分:1)

app / Config / core.php中有一个配置来更改会话cookie域:

Configure::write('Session', array(
    'defaults' => 'php',
    'ini' => array(
        'cookie_domain' => '.example.com'
    )
));