带有Auth+ACL的CakePHP应用程序和带有Auth但没有ACL的插件

带有Auth+ACL的CakePHP应用程序和带有Auth但没有ACL的插件,cakephp,authentication,cakephp-2.0,acl,cakephp-acl,Cakephp,Authentication,Cakephp 2.0,Acl,Cakephp Acl,我有一个带有Auth和ACL的CakePHP应用程序设置 我还做了一个插件在这个应用程序中,包括一个单独的登录到另一个部分的网站远离应用程序。这使用Auth登录到不同的表上,并且不需要ACL,因为用户将能够访问站点这一小部分的所有区域 我已使用以下方法成功地分离了这两个身份验证: AuthComponent::$sessionKey= 'Auth.Recipient'; 在插件的AppController和 AuthComponent::$sessionKey= 'Auth.User';

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

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

我已使用以下方法成功地分离了这两个身份验证:

AuthComponent::$sessionKey= 'Auth.Recipient'; 
在插件的AppController和

AuthComponent::$sessionKey= 'Auth.User';
在应用程序的AppController中

这似乎工作得很好,让我可以分别登录到站点的两个区域

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

AclNode::node() - Couldn't find Aro node identified by "Array ( [Aro0.model] => Group [Aro0.foreign_key] => ) "
出于绝望,我试着运行AclExtras.AclExtras aco_sync,但毫不奇怪,它不起作用

我试图解决这个问题,通过添加另一个我正在使用的名为Customer的组ACL,然后为在我的插件表中创建的所有用户分配Customer组id

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

将方法名称添加到:

$this->Auth->allow('');
工作,但显然不是一个解决方案,虽然是指向我的方向,这是许可相关的


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

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

伪应用程序控制器 创建一个新的控制器类,例如MyAppController,它扩展了核心AppController,然后可以将核心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中

重写插件控制器构造 利用OOP并重写plugins PluginAppController中的_构造方法,以防止加载ACL组件

class PluginAppController extends AppController
{
    public __constrcut($request = null, $response = null)
    {
        // modify this to prevent components you don't want
    }
}