我在CakePHP(2.4.1)应用中遇到了一个问题,我的某个模型中的虚拟字段未使用Cake Security::rijndael()
正确解密。在我的用户模型中,显示字段定义为
public $virtualFields = array( 'name' => 'CONCAT(User.first_name, " ", User.last_name)' );
User.first_name和User.last_name都是加密的,User.name是模型的displayField。在AssignedShift相关模型(User hasMany AssignedShift)中,User.name字段未正确解密。以下是返回示例:
Array(
[1] => Test|�d�F�3��������������S0�Dy=>�dJ���sP�4�F�n�s-#���7P���n�ʙ.�C�@���˷C�z��(;Eu)�
)
这是唯一发生这种情况的模型,所以我非常有信心我的afterFind方法正常工作。在任何情况下,以下是加密/解密的功能:
/*AppModel.php*/
function _afterFind($results, $primary) {
if( $primary ) {
foreach( $results as $key => $val) {
if( isset( $val[$this->alias] ) ) {
$results[$key][$this->alias] = $this->doAfterFind( $results[$key][$this->alias] );
}
}
} else {
if( isset( $results['id']) ) {
$results = $this->doAfterFind($results);
} else {
foreach( $results as $key => $val ) {
if( isset( $val[$this->alias] ) ) {
if( isset( $val[$this->alias]['id'] ) ) {
$results[$key][$this->alias] = $this->doAfterFind( $results[$key][$this->alias] );
} else {
foreach( $results[$key][$this->alias] as $key2 => $val2 ) {
$results[$key][$this->alias][$key2] = $this->doAfterFind( $results[$key][$this->alias][$key2] );
}
}
}
}
}
}
return $results;
}
public function doAfterFind($data) {
foreach( $data as $key => $val) {
if( !empty( $val ) && strlen( $val ) >= 88) {
$data[$key] = Security::rijndael( base64_decode( $val ), Configure::read( 'Security.cipherSeed' ), 'decrypt' );
}
}
//My attempt at hacking it back together
if(array_key_exists('first_name', $data)) {
$data['name'] = $data['first_name'] ." ". $data['last_name'];
}
return $data;
}
/*AssignedShift.php*/
public function afterFind($results, $primary = false) {
return $this->_afterFind($results, $primary);
}
这两个模型都是从控制台创建的 - 用户已被修改但我还没有触及这些关系,AssignedShift完全不受影响。有任何想法吗?提前谢谢。