我希望在添加/编辑表单字段时对它们进行加密,在通过cake查找时对它们进行解密。下面是在v2.7.2中对我有效的代码:
core.php
Configure::write('Security.key','secretkey');
应用程序/模型/患者. php。
public $encryptedFields = array('patient_surname', 'patient_first_name');
public function beforeSave($options = array()) {
foreach($this->encryptedFields as $fieldName){
if(!empty($this->data[$this->alias][$fieldName])){
$this->data[$this->alias][$fieldName] = Security::encrypt(
$this->data[$this->alias][$fieldName],
Configure::read('Security.key')
);
}
}
return true;
}
public function afterFind($results, $primary = false) {
foreach ($results as $key => $val) {
foreach($this->encryptedFields as $fieldName) {
if (@is_array($results[$key][$this->alias])) {
$results[$key][$this->alias][$fieldName] = Security::decrypt(
$results[$key][$this->alias][$fieldName],
Configure::read('Security.key')
);
}
}
}
return $results;
}
据我所知,我必须用为模型生成的实体替换$this-〉data[],用虚字段替换afterFind方法,但我就是不能把它们放在一起。
2条答案
按热度按时间v64noz0r1#
解决这个问题的方法不止一种(请注意,下面的代码是未经测试的示例代码!在使用这些代码之前,您应该先掌握一些新的基础知识)。
自定义数据库类型
一种是自定义数据库类型,它在将值绑定到数据库语句时进行加密,在获取结果时进行解密。
下面是一个简单的示例,假设db列可以保存二进制数据。
源代码/数据库/类型/加密类型.php
这应该是相当自我解释的,当转换到数据库时加密,当转换到PHP时解密。
源代码/配置/引导程序.php
注册自定义类型。
源代码/模型/表/患者表.php
最后,将可加密列Map到已注册的类型,就这样,从现在开始,一切都将自动处理。
请参阅操作手册〉数据库访问和ORM〉数据库基础知识〉添加自定义类型
beforeSave和结果格式化程序
一个不那么枯燥和紧密耦合的方法,基本上是2.x代码的一个移植,是使用
beforeSave
回调/事件,和一个结果格式化程序。例如,结果格式化程序可以附加在beforeFind
事件/回调中。在
beforeSave
中,只需向/从传递的实体示例设置/获取值,您可以使用Entity::has()
、Entity::get()
和Entity::set()
,甚至使用数组访问,因为实体实现了ArrayAccess
。结果格式化程序基本上是一个after find挂钩,您可以使用它轻松地迭代结果,并修改它们。
这里有一个基本的例子,不需要做更多的解释:
为了将其稍微分离,您还可以将其移动到一个行为中,以便可以在多个模型之间轻松共享。
另请参阅
*Cookbook〉数据库访问和ORM〉数据库基础知识〉添加自定义类型
*Cookbook〉数据库访问和ORM〉查询生成器〉添加计算字段
*Cookbook〉教程和示例〉书签教程第2部分〉持久化标记字符串
dxpyg8gm2#
编辑:@npm关于虚拟属性不起作用的说法是正确的。现在我对自己给了一个糟糕的答案感到愤怒。活该我在发帖前没有检查它。
为了使它正确,我实现了一个使用behaviors的版本,在读取字段时对其进行解密,在将字段写入数据库时对其进行加密。
注意:此代码当前不包含任何自定义查找器,因此它不支持按加密字段进行搜索。
例如
行为
/src/Model/Behavior/EncryptBehavior.php
表格
/src/Model/Table/PatientsTable.php
我理解你的痛苦。cakephp 3中的ORM层与cake 2有根本的不同。他们将实体模型和表ORM分成两个不同的类,并且afterFind已经被删除。我会考虑使用虚拟属性。我认为它可能适合你的用例。
示例如下。