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

时间:2013-08-28 15:21:24

标签: cakephp authentication cakephp-2.0 acl cakephp-acl

我使用Auth和ACL设置了CakePHP应用程序。

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

我已设法使用以下方法分隔两个Auth:

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,但这并不奇怪,不起作用。

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

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

将方法名称添加到:

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

有效,但显然不是解决方案,尽管我指的是这与许可相关的方向。

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

1 个答案:

答案 0 :(得分:0)

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

Pseudo App Controller

创建一个新的控制器类,例如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
{
}

插件app控制器

class PluginAppController extends AppController
{
}

这将阻止插件继承任何方法或实例变量,但显然不是很好的设计,因为您将丢失您希望在App及其插件之间共享的任何方法。除非您将它们提取到组件中并将它们添加到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
    }
}