【发布时间】:2018-03-20 15:43:50
【问题描述】:
有没有办法在控制器之外检查 CakePHP (2.10) 中的 ACL?我知道您可以通过包含 AclComponent 然后执行以下操作从 inside 控制器检查 ACL:
$canEdit = $this->Acl->check('User.1', 'Post.1', 'update');
有没有办法在其他地方执行此操作,例如从 shell 类内部或模型内部?
提前致谢!
【问题讨论】:
有没有办法在控制器之外检查 CakePHP (2.10) 中的 ACL?我知道您可以通过包含 AclComponent 然后执行以下操作从 inside 控制器检查 ACL:
$canEdit = $this->Acl->check('User.1', 'Post.1', 'update');
有没有办法在其他地方执行此操作,例如从 shell 类内部或模型内部?
提前致谢!
【问题讨论】:
好吧,你可以做 ACL shell 所做的事情,那就是利用组件。就我个人而言,我不喜欢这种做法,因为组件被认为是控制器层的服务,但是哦,好吧,CakePHP 2.x 内部就是这样做的,ACL 适配器也与组件纠缠在一起,因此与控制器层,请参阅 AclInterface::initialize(),它需要一个 Component 实例。
App::uses('Controller', 'Controller');
App::uses('ComponentCollection', 'Controller');
App::uses('AclComponent', 'Controller/Component');
$controller = new Controller();
$collection = new ComponentCollection();
$Acl = new AclComponent($collection);
$Acl->startup($controller);
$canEdit = $Acl->check('User.1', 'Post.1', 'update');
如果您只使用数据库支持的 ACL,即不需要组件提供的抽象,那么您也可以简单地访问数据库 ACL 适配器内部使用的 Permission 模型,并且提供检查权限的方法:
App::uses('ClassRegistry', 'Utility');
$Permission = ClassRegistry::init(array(
'class' => 'Permission',
'alias' => 'Permission'
));
$canEdit = $Permission->check('User.1', 'Post.1', 'update');
另见
【讨论】: