【问题标题】:CakePHP App with Auth + ACL and Plugin with Auth but no ACL带有 Auth + ACL 的 CakePHP 应用程序和带有 Auth 但没有 ACL 的插件
【发布时间】:2013-08-28 15:21:23
【问题描述】:

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

我还在这个应用程序中创建了一个插件,其中包括一个单独的登录到该应用程序之外的站点的另一部分。这使用 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,但毫无疑问没有奏效。

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

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

将方法名称添加到:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我有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 并覆盖插件 PluginAppController 中的 __construct 方法,以防止加载 ACL 组件

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多