Cakephp 2.0更改密码

时间:2012-01-20 18:05:37

标签: cakephp

我正在尝试在cakephp 2.0中创建一个更改密码表单。我发现了EuroMark为1.3创建的行为,现在很难将此代码转换为使用2.0。我知道它与Auth组件有关,因为2.0中的这个组件发生了重大变化。

public function validateCurrentPwd(Model $Model, $data) {
if (is_array($data)) {
    $pwd = array_shift($data);
} else {
    $pwd = $data;
}

$uid = null;
if ($Model->id) {
    $uid = $Model->id;
} elseif (!empty($Model->data[$Model->alias]['id'])) {
    $uid = $Model->data[$Model->alias]['id'];
} else {
    return false;
}

if (class_exists('AuthExtComponent')) {
    $this->Auth = new AuthExtComponent();
} elseif (class_exists($this->settings[$Model->alias]['auth'].'Component')) {
    $auth = $this->settings[$Model->alias]['auth'].'Component';
    $this->Auth = new $auth();
} else {
    return true;
}
return $this->Auth->verifyUser($uid, $pwd);
}

我在读取$ this->的线路上收到错误:Auth = new $ auth(); 错误如下:

Argument 1 passed to Component::__construct() must be an instance of ComponentCollection, none given, called in C:\UniServer\www\new_company_test\app\Model\Behavior\change_password.php on line 117 and defined [CORE\Cake\Controller\Component.php, line 77]

Undefined variable: collection [CORE\Cake\Controller\Component.php, line 78]

它也在抛出这个

Call to undefined method AuthComponent::verifyUser() in C:\UniServer\www\new_company_test\app\Model\Behavior\change_password.php on line 121 

我不确定脚本中是否还有其他需要解决的问题,我猜不会因为没有其他地方使用Auth。

关于我需要做些什么才能让它发挥作用?任何帮助表示赞赏。 感谢

1 个答案:

答案 0 :(得分:1)

你确实发现还有一个2.0分支,不是吗? :) 它应该包含相同的行为: https://github.com/dereuromark/tools/tree/2.0

无论哪种方式,您都需要将组件集合传递给它:

$this->Auth = new AuthExtComponent(new ComponentCollection());

您应该在自定义AuthExt组件中创建方法verifyUser,该方法将“当前密码”的Auth组件扩展为以下方式:

/**
 * Quickfix
 * TODO: improve - maybe use Authenticate
 * @return bool $success
 */
public function verifyUser($id, $pwd) {
    $options = array(
        'conditions' => array('id'=>$id, 'password'=>$this->password($pwd)),
    );
    return $this->getModel()->find('first', $options);

    $this->constructAuthenticate();
    $this->request->data['User']['password'] = $pwd;
    return $this->identify($this->request, $this->response);
}

/**
 * returns the current User model
 * @return object $User
 */
public function getModel() {
    return ClassRegistry::init(CLASS_USER); 
}

也许也可以直接在行为中使用现有的identify方法和假请求对象? 我正在考虑使用

$this->authenticate = array('Form'=>array('fields'=>array('username' => 'id')));

随意分叉行为并提交拉取请求。

“当前密码”是目前尚未完全解决的唯一问题。