1

我有一个带有 Auth 和 ACL 的 CakePHP 应用程序设置。

我还在这个应用程序中制作了一个插件,其中包括一个单独的登录到远离应用程序的网站的另一部分。这使用 Auth 在不同的表上登录,并且不需要 ACL,因为用户将能够访问该站点的这一小部分的所有区域。

我设法使用以下方法将两个身份验证分开:

AuthComponent::$sessionKey= 'Auth.Recipient'; 

在插件的 AppController 和

AuthComponent::$sessionKey= 'Auth.User';

在 App 的 AppController 中

这似乎运作良好,让我可以分别登录网站的两个区域。

接下来,当我尝试在我的插件中添加更多方法时,我收到了错误:

AclNode::node() - Couldn't find Aro node identified by "Array ( [Aro0.model] => Group [Aro0.foreign_key] => ) "

我绝望地尝试运行 AclExtras.AclExtras aco_sync ,但这并不奇怪。

我试图通过添加另一个名为“客户”的组(我正在使用组 ACL)来解决这个问题,然后为我的插件表中创建的所有用户分配客户组 ID。

这停止了​​错误,接下来我尝试为这些用户的 users/initdb 方法添加一个新行,以便他们只能访问客户控制器。但是,如果他们尝试访问它,他们将被踢出登录页面,就好像他们无权访问此控制器一样。

将方法名称添加到:

$this->Auth->allow('');

有效,但显然不是一个解决方案,尽管它为我指明了与许可相关的方向。

对我来说,理想的解决方案是我可以简单地停止插件从应用程序继承任何 ACL。

4

1 回答 1

0

我有 2 条可能的建议来打破 CakePHP 的继承结构以防止插件加载组件

伪应用控制器

例如,创建一个新的控制器类,MyAppController它扩展了核心AppController,然后可以将其用作主应用程序控制器的父级,而AppController保持为空的核心用于插件。然后插件不会继承任何东西

你的结构应该是这样的

一个普通的 AppController 类

// app/Controller/AppController.php
class AppController extends Controller
{
    // left empty intentionally
}

插件的伪 AppController

class MyAppController extends Controller
{
    // all code for the main app
    // used for all your normal app controllers

    public $components = array('Acl', 'Auth');

    // -- snip -- //

}

主应用程序中的示例控制器

App::uses('Controller', 'MyAppController');
class PostsController extends MyAppController
{
}

和插件应用控制器

class PluginAppController extends AppController
{
}

这将防止插件继承任何方法或实例变量,但显然不是很好的设计,因为您将丢失您希望在应用程序及其插件之间共享的任何方法。除非您将它们提取到组件中并将它们添加到AppController

覆盖插件控制器 __construct

利用 OOP 并覆盖__construct插件中的方法PluginAppController以防止ACL组件被加载

class PluginAppController extends AppController
{
    public __constrcut($request = null, $response = null)
    {
        // modify this to prevent components you don't want
    }
}
于 2013-08-28T15:56:33.497 回答