在Cake 2中,您可以保存模型并指定要将保存限制到的字段。
是否有一种内置方式可以在Cake 3中完成此操作?例如,如果将请求数据直接放入新实体然后保存,那么如何告诉该方法只保存我允许的字段?
简化示例
// User makes a request; their POST data goes directly into the entity
$customer = $this->Customers->newEntity($this->request->data);
$this->Customers->save($customer);
这里显而易见的危险是我可以通过请求在该客户实体上设置我喜欢的任何属性。实际上,我只想保存几个特定的字段。
答案 0 :(得分:3)
这就是以$_accessible
实体属性
class Customer extends Entity
{
// allow only `first_name` and `last_name` to be mass assigned
protected $_accessible = [
'first_name' => true,
'last_name' => true
];
}
以及fieldList
accessibleFields
和Table::newEntity/newEntities/patchEntity/patchEntities()
选项
// allow only `first_name` and `last_name` to be mass assigned,
// ignoring the entity accessible defaults
$customer = $this->Customers->newEntity($this->request->data(), [
'fieldList' => [
'first_name',
'last_name'
]
]);
accessibleFields
选项将仅更改指定字段的可访问性。此外,它实际上会修改实体,即与fieldList
不同,编组器将仅用作白名单而不是实体默认值,accessibleFields
将更改实体$_accessible
属性的值!
见
答案 1 :(得分:1)
有两种方法可以保护您免受此问题的影响。第一种方法是使用实体中的Mass Assignment功能设置可以通过请求安全设置的默认列。
_accessible属性允许您提供属性映射以及是否可以批量分配它们。值true和false表示是否可以对字段进行质量分配:
http://book.cakephp.org/3.0/en/orm/entities.html#entities-mass-assignment
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity
{
protected $_accessible = [
'title' => true,
'body' => true,
'*' => false,
];
}
第二种方法是在创建或合并数据到实体时使用fieldList选项:
// Contains ['user_id' => 100, 'title' => 'Hacked!'];
$data = $this->request->data;
// Only allow title to be changed
$entity = $this->patchEntity($entity, $data, [
'fieldList' => ['title']
]);
$this->save($entity);
您还可以控制可以为关联指定的属性:
// Only allow changing the title and tags
// and the tag name is the only column that can be set
$entity = $this->patchEntity($entity, $data, [
'fieldList' => ['title', 'tags'],
'associated' => ['Tags' => ['fieldList' => ['name']]]
]);
$this->save($entity);
如果您的用户可以访问许多不同的功能,并且您希望让您的用户根据他们的权限编辑不同的数据,则使用此功能非常方便。
newEntity(),newEntities()和patchEntities()方法也接受fieldList选项。