CakePHP:单域上的多个安装;登录会话共享问题

时间:2014-08-19 09:48:16

标签: session cakephp

我已经将CakePHP安装到子目录中,它们似乎运行良好!它们都有不同的 database.php 配置文件,并访问不同的数据库。

示例:

  1. public_html / cakephp1 /
  2. 的public_html / cakephp2 /
  3. 我使用http://www.example.com/cakephp1/http://www.example.com/cakephp2/分别访问它们,这一切似乎都很好。

    当我登录其中一个时出现问题(使用CakePHP标准Auth / Session组件),当我翻到另一个安装时,它也认为我已经登录了! / p>

    如何防止这种情况?什么是推荐的解决方案?如果我在每次安装中更改salt值会有帮助吗?

    修改

    嗨,Martin,我刚刚尝试了更改core.php的方法来使用“cake”会话处理并指定cookie路径。所以现在在每个应用程序中我都有不同的core.php文件:

    cakephp1的core.php

    Configure::write('Session', array(
            'defaults' => 'cake',
            'ini' => array(
                'session.cookie_path' => '/cakephp1'
            )
        )); 
    

    cakephp2的core.php

    Configure::write('Session', array(
            'defaults' => 'cake',
            'ini' => array(
                'session.cookie_path' => '/cakephp2'
            )
        )); 
    

    但仍然无效,两个安装似乎仍然共享同一个会话。我应该在哪里查看是否真的创建了cookie?我检查了每个/ cakephp1和/ cakephp2下的文件夹tmp / sessions,但该文件夹始终为空。

    编辑:修改AppController:

    马丁,请帮我提一下建议的地方。我跟着你的代码如下:

    以下是我的/ demo /安装的代码(驻留在public_html / demo /) 您能告诉我在哪里可以找到应该使用您的代码创建的Cookie吗?

    如果它应该在public_html / demo / app / tmp / sessions中,我甚至在登录后都看不到任何内容。在public_html / demo /下,除了标准的CakePHP文件夹之外,也没有任何内容。

    这是来自我的AppController的/ demo /安装,可以通过http://www.example.com/demo/访问,而不是http://www.example.com/tst/

    的其他安装
    public $components = array(
        //'DebugKit.Toolbar',
       'Cookie',
       'Session',
        'Auth'=>array(
         //Stuff
        )
    }
    
    public function beforeFilter() {
        //Logic placed here will run before the action is run
        parent::beforeFilter();
        $this->Cookie->path = '/demo/';        
    
    }
    

    将core.php设置为默认值:

    Configure::write('Session', array(
        'defaults' => 'php'
    ));
    

4 个答案:

答案 0 :(得分:2)

您需要将每个应用程序中的cookie限制在各自的子目录中。例如,在 AppController.php 中,您可以在beforeFilter()操作中执行此操作:

<?php

class AppController extends Controller {

    public $components = array(
        'Cookie',
    );

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Cookie->path = '/cakephp1/';
    }

}

有关详细信息,请参阅http://book.cakephp.org/2.0/en/core-libraries/components/cookie.html#controller-setup

答案 1 :(得分:2)

我有类似的问题。

在core.php / bootstrap.php

中使用以下代码进行第一个cakephp应用程序
  

配置::写('Security.cookie','cakephp1');

而在第二个cakephp应用程序中使用core.php / bootstrap.php中的以下代码

  

配置::写('Security.cookie','cakephp2');

答案 2 :(得分:1)

最后解决了我的问题。

我的代码中有一个session_start()php命令覆盖了所有的core.php配置,基本上它恢复了php.ini会话管理设置。

CakePHP Session being written to /tmp/ and not /app/tmp/sessions/

答案 3 :(得分:0)

虽然有些答案谈论cookie,但没有提及使用Cake自己的会话或PHP会话。所以,我认为分享一种记录在案的方式是很好的。

CakePHP(至少2.x)默认使用php中的php.ini会话设置。

该设置可在/app/Config/core.php中找到,并在那里有详细记录:

Configure::write('Session', array(
    'defaults' => 'php' // possible values: php, cake, database, cache
));

对于拥有cake installation directory的应用,只需将上述值更改为cake即可告诉应用使用app/tmp/sessions保存会话文件。必须提到可能需要为每个安装使用不同的cookie名称:

Configure::write('Session', array(
    'defaults' => 'cake'
    'cookie' => 'myApp1' // something like 'myApp2' for other app
));

Cookbook提供了与会话相关的所有设置的良好文档。