使用CakePHP Auth组件的唯一用户名和电子邮件

时间:2012-07-09 17:12:07

标签: php cakephp user-registration

我是Cake的新手并构建一个应用程序来学习它。我的用户注册系统遇到了一些麻烦。到目前为止,这是我的Users控制器中的注册码:

public function register() {
    $this->set('title_for_layout', 'Register');
    if ($this->request->is('post')) {
        $this->User->create();
        if ($this->User->save($this->request->data)) {
            $this->Session->setFlash('The user has been saved');
            $this->redirect(array('action' => 'register'));
        } else {
            $this->Session->setFlash('The user could not be saved. Please, try again.');
        }
    }
}

在我的User模型中,我使用这种方法来散列密码:

public function beforeSave() {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
    }
    return true;
}

这很有效,用户的用户名,电子邮件和散列密码将用户添加到我的数据库中的users表中。但是,没有进行任何检查以确保用户名和电子邮件是唯一的。

根据我的有限理解,我需要在我的User模型中添加一些验证规则,以确保用户名和电子邮件字段在输入表格之前是唯一的?目前我只有这些验证规则:

public $validate = array(
    'username' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'A username is required'
        )
    ),
    'email' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'An email is required'
        )
    ),
    'password' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'A password is required'
        )
    )
);

此外,我的注册表单中有一个名为Password (confirm)的{​​{1}}字段。我想检查用户是否在输入用户表之前正确输入了密码,但我不知道该怎么做。我猜我的寄存器方法中的某处我需要检查两个密码是否相同。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

isUnique规则适用于您的用户名和电子邮件字段。以下是一个代码示例,演示了如何为每个字段使用多个规则:

public $validate = array(
    'username' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'You must enter a username.'
        ),
        'length' => array(
            'rule' => array('between', 3, 15),
            'message' => 'Your username must be between 3 and 15 characters long.'
        ),
        'unique' => array(
            'rule'    => 'isUnique',
            'message' => 'This username has already been taken.'
        )
    ),
    'password' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'You must enter a password.'
        ),
        'length' => array(
            'rule' => array('minLength', '6'),
            'message' => 'Your password must be at least 6 characters long.'
        )
    ),
        'email' => array(
            'email' => array(
            'rule'    => array('email'),
            'message' => 'Please enter a valid email address.'
        )
    )
);

至于比较密码只需编辑你的beforeSave回调并相互检查密码,如果匹配则返回true,如果不匹配则返回false。像这样:

public function beforeSave() {
    if (isset($this->data[$this->alias]['password'])) {
        if($this->data[$this->alias]['password'] === $this->data[$this->alias]['passwordConf']) {
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
            return true;
        } else {
            return false;
        }
    }
    return true;
}

答案 1 :(得分:3)

CakePHP实际上有一个名为isUnique的验证规则,您可以使用它来检查用户名和电子邮件。可以找到内置规则列表here。您可以使用此Data Validation Tutorial来检查用户名和电子邮件。至于检查密码是否相同,您可以使用规则列表中显示的EqualTo规则,假设您可以在每次请求时动态制定验证规则。