我使用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的任何继承。
答案 0 :(得分:0)
我有两个可能的建议,打破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
{
}
插件app控制器
class PluginAppController extends AppController
{
}
这将阻止插件继承任何方法或实例变量,但显然不是很好的设计,因为您将丢失您希望在App及其插件之间共享的任何方法。除非您将它们提取到组件中并将它们添加到AppController
利用OOP并覆盖插件__construct
中的PluginAppController
方法,以防止ACL
组件被加载
class PluginAppController extends AppController
{
public __constrcut($request = null, $response = null)
{
// modify this to prevent components you don't want
}
}