CakePHP没有完全解密虚拟字段

时间:2014-04-03 20:24:19

标签: php cakephp encryption

我在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完全不受影响。有任何想法吗?提前谢谢。

0 个答案:

没有答案