如何在CakePHP 3中为管理员禁用$\可访问保护?

如何在CakePHP 3中为管理员禁用$\可访问保护?,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,我一直想这么做,但现在我放弃了。 在CakePHP 3中,通过在实体变量$\u accessible中设置,可以防止大规模分配漏洞。这对黑客很有帮助,但在构建管理面板时也很烦人。 我的问题是,如何对前缀为“admin”的所有控制器禁用此保护,并将其保留给其他控制器 在保存之前无法在模型中执行此操作,因为执行此操作太晚 我也尝试过创造行为,但它无法触及实体,即事情发生的地方 最接近的方法是在模型中覆盖方法newEntity(),但这样我必须在每个模型中都这样做,这不是很好的解决方案 我也知道,当

我一直想这么做,但现在我放弃了。 在CakePHP 3中,通过在实体变量$\u accessible中设置,可以防止大规模分配漏洞。这对黑客很有帮助,但在构建管理面板时也很烦人。 我的问题是,如何对前缀为“admin”的所有控制器禁用此保护,并将其保留给其他控制器

  • 在保存之前无法在模型中执行此操作,因为执行此操作太晚
  • 我也尝试过创造行为,但它无法触及实体,即事情发生的地方
  • 最接近的方法是在模型中覆盖方法newEntity(),但这样我必须在每个模型中都这样做,这不是很好的解决方案
  • 我也知道,当我保存数据时,它可以在控制器操作中完成,但为每个管理操作编写数据。。。嗯,一定有更好的办法

在src/Model/entity文件夹中创建实体类,然后定义受保护的

$_accessible = [
        '*' => true
    ];
冒充 这本书的解决方案是使用

也适用于

['guard'=>false]
添加到相关控制器代码应该不会那么困难,或多或少地查找和替换,并且不太可能在将来导致问题(意外地为无管理操作禁用了guard)

在元帅之前 或者,您可以使用修改选项
guard=>false
。由于您希望成为“所有管理功能”,因此最好的方法是使用以下命令来实现管理功能:

// Some controller
use Cake\Event\EventManager;

public function beforeFilter()
{
    EventManager::instance()->on(
        'Model.beforeMarshal',
        function ($event, $data, $options) {
            $options['guard'] = false;
        }
    );
}

您可以创建自己的AppEntity类,该类将扩展Cake\ORM\Entity,您的实体也将扩展该类。该类的u构造函数可以设置
$this->_accessible=['*'=>true]如果它在管理函数中,您可以通过读取在AppController::beforeFilter中有条件写入的配置值来测试它。这就是。考虑到实体在每个类中被烘焙和定义为可访问的问题,这不会产生任何效果。
// Some controller
use Cake\Event\EventManager;

public function beforeFilter()
{
    EventManager::instance()->on(
        'Model.beforeMarshal',
        function ($event, $data, $options) {
            $options['guard'] = false;
        }
    );
}