Cakephp注册问题

时间:2011-04-26 12:34:20

标签: cakephp authentication

我按照CakephpTV上的教程进行了AuthComponent的注册。昨天一切都很好,但今天不是。

当我尝试添加新帐户时,它说密码不匹配,并且在密码字段中有散列密码,在密码确认中有正常(非散列)密码。

我的UserController类:

class UsersController extends AppController
{
    function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('new_user');

        if($this->action == 'add' || $this->action == 'edit') {
            $this->Auth->authenticate = $this->User;
        }
    }

    function new_user()
    {
        if (!empty($this->data)) {            
            if ($this->User->save($this->data)) {                   
                $this->Session->setFlash('Rejestracja zakończona pomyślnie');                
                $this->redirect(array('action' => 'index'));            
            }        
        }
    }

    function login() {

    }

    function logout() {
        $this->redirect($this->Auth->logout());
    }
}

我的用户模型:

class User extends AppModel {
    var $name = 'User';
    var $validate = array (
        'email' => array(
            'Please supply a valid email address.' => array(
                'rule' => 'email',
                'message' => 'Please supply a valid email address.'
            ),
            'Already exists' => array(
                'rule' => 'isUnique',
                'message' => 'Must be unique'
            )
        ),
        'password' => array (
            'aThis field must have between 6 and 40 alphanumeric characters.' => array(
                'rule' => '/^[^\'"]{6,40}$/i',
                'message' => 'aThis field must have between 6 and 40 alphanumeric characters.'
            ),
            'Do not match' => array(
                'rule' => 'matchPasswords',
                'message' => 'Do not match'
            )
        )  
  );

  function matchPasswords($data) {
    if($data['password'] == $this->data['User']['password_confirmation']) {
        return TRUE;
    }
    $this->invalidate('password_confirmation', 'DO not match');
    return FALSE;
  }

  function hashPasswords($data) {
    if(isset($this->data['User']['password'])) {
        $this->data['User']['password'] = Security::hash($this->data['User']['password'], NULL, TRUE);
        return $data;
    }
    return $data;
  }

  function beforeSave() {
    $this->hashPasswords(NULL, TRUE);
    $this->data['User']['registration_date'] = date("Y-m-d H:i:s");
    return TRUE;
  }
}

我的new_user.ctp:

echo $this->Form->create('User', array('action' => 'new_user'));
    echo $this->Form->input('email');
    echo $this->Form->input('password');
    echo $this->Form->input('password_confirmation',array('type' => 'password')); 
    echo $this->Form->end('Zarejestruj');

我的AppController类:

class AppController extends Controller {
    var $components = array('Auth','Session');

    function beforeFilter() {
        $this->Auth->fields = array('username' => 'email', 'password' => 'password');
        $this->Auth->allow('index','view','display','new_user');
        $this->Auth->authError = 'Zaloguj się aby zobaczyć tą stronę.';
        $this->Auth->loginError = 'Wprowadzono niepoprawne dane.';
        $this->Auth->loginRedirect = array('controller'=>'pages','action'=>'home');
        $this->Auth->loginRedirect = array('controller'=>'pages','action'=>'home');
    }
}

1 个答案:

答案 0 :(得分:3)

CakePHP会自动在password模型中隐藏名为User的字段。这就是在表单失败时返回已经哈希的密码的原因。您可能想要检查您获得的哈希值是否与您希望返回的哈希值相同。

除此之外,在您的matchPasswords函数中,您$this->data['password']检查了$this->data['User']['password'],而我认为应该是{{1}}。