如何允许在同一台服务器上的多个cakephp 3应用程序之间进行单点登录?

时间:2015-11-13 02:27:18

标签: cakephp authentication redis cakephp-3.0

场合

我目前在同一个Ubuntu服务器上有两个cakephp 3应用程序,使用相同的MySQL和不同的数据库。

让我们调用第一个应用Hammy(使用数据库名称hammy) 让我们调用第二个应用Chewy(使用数据库名称chewy

Hammy最初是为特定客户的公司构建的,因此users数据库中有groupshammy个表。

随后,我需要为同一个客户和另一个客户构建Chewy

chewy内,我设计了usersgroups个表,但附加了一个名为account_id的列。

这些是我用于上述设置的域名:

customerA.hammy.com customerA.chewy.com customerB.chewy.com

我想要什么

我想要的是,在customerA.hammy.com中的用户点击将她发送给customerA.chewy.com的链接后,她可以继续访问customerA.chewy.com

无论用户登录customerA.hammy.com还是customerA.chewy.com,她都可以毫无问题地访问这两个网络应用。

基本上是单点登录。

我的选择

这些是我如何解决这个问题的想法。

  1. 我可以创建第三个Web应用程序,它基本上只是一个基本上处理Hammy和Chewy身份验证的Web服务。
  2. 我熟悉使用CakePHP 3.x构建Web服务

    但是,我不熟悉身份验证选项。

    这是我在Hammy和Chewy的AppController

    中使用的
    $authOptions = [
            'loginRedirect' => [
                'controller' => 'Pages',
                'action' => 'overview'
            ],
            'logoutRedirect' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            'authorize' => ['Controller'],
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ],
                ],
            ],
            'unauthorizedRedirect' => [
                'controller' => 'Users',
                'action' => 'login',
            ],
        ];
        $this->loadComponent('Auth', $authOptions);
    
    1. 使用redis
    2. 缺点是我从未尝试过Redis,所以我甚至没有一个概念性的想法如何实现它。

      欢迎任何建议。

      谢谢。

1 个答案:

答案 0 :(得分:1)

CakePHP 3.x doc : Manually Logging Users In

有了这个,你可以避免"自然" cakephp登录,并强制它以您想要的方式记录您的用户。

最大的问题是你在Cakephp sub-domaine之间没有任何共享部分。

对我来说(但那是可以完善的):

  • 我将在服务器上创建一个共享文件夹/ DB,
  • 在每次登录时生成令牌(自然或自动),
  • 将其存储在共享部分和用户cookie中

在更改Dom时,检查cookie是否存在,如果是,检查它是否合法,如果是,则生成新令牌以擦除旧令牌并在新Dom上自动登录我的用户。

这样,您可以将数据链接到共享部分中的配置文件(序列化数组在文件或数据库字段中)......

小心使用令牌作为密码的安全风险:

  • 一个仅用于令牌,
  • 删除旧令牌,
  • 尝试阅读一些关于在客户端保持令牌安全的内容
顺便说一句,这可能是一个愚蠢的想法,但如果你在同一台服务器上运行相同的cakephp版本,为什么不使用符号链接为每个cakephp会话创建一个共享文件夹?