【问题标题】:Cakephp 3: Shared Database Session Across Multiple AppsCakephp 3:跨多个应用程序的共享数据库会话
【发布时间】:2019-12-07 22:00:35
【问题描述】:

我有两个 Cakephp 3 应用程序,它们将它们的会话保存在同一个数据库的同一个“会话”表中。我一直在尝试进行设置,以便它们共享相同的会话,这样当我登录到其中一个时,我会自动登录到另一个。

我在他们的两个app.php 文件中都有这个:

'Session' => [
    'defaults' => 'database'
],

这是他们都使用的“会话”表:

同时登录会导致它们在表中具有不同的条目。

提前感谢您的任何建议。

【问题讨论】:

  • 会话密钥存储在 cookie 中,因此您还需要确保一个站点写入的任何 cookie 对另一个站点可用。我认为只有在它们都在同一个主域上时才能工作(例如 example.com 和 other.example.com,或 a.example.com 和 b.example.com)。

标签: php session cakephp cookies cakephp-3.0


【解决方案1】:

虽然这在理论上是可行的,但请注意,由于数据库存储的会话不是线程锁定的,因此多个应用程序可能会同时写入会话。会话数据(所有身份验证信息)中存储了大量数据,因此您需要小心确保用户数据在所有应用中得到统一处理。

但通常您会希望创建一个包含共享“会话”表的新数据源(例如,在 app.php 中名为 shared_sessions

'Datasources'    => [ 
    'shared_sessions'   => [
        'className'        => 'Cake\Database\Connection',
        'driver'           => 'Cake\Database\Driver\Mysql',
        'persistent'       => false,
        'host'             => 'localhost',
        'port'             => '3306',
        'username'         => 'sessions_user',
        'password'         => '*******',
        'database'         => 'SHARED_SESSIONS',
        'timezone'         => 'UTC'
    ],

如果您还没有SessionsTable,请创建它并指定备用连接信息:

class SessionsTable extends Table
{
    /**
     * @return string
     */
    public static function defaultConnectionName()
    {
        return 'shared_sessions';
    }

    ....

您可能仍需要处理其他身份验证数据的差异,具体取决于每个应用程序设置/操作它的方式,您可能需要在共享数据库中进行一些集中存储,但还需要在应用程序级别存储身份验证数据,使用自定义存储处理程序。

见:

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多