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

Posted

技术标签:

【中文标题】带有 CakePHP Auth 组件的唯一用户名和电子邮件【英文标题】:Unique username and email with CakePHP Auth component 【发布时间】:2012-07-09 03:15:24 【问题描述】:

我是 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'
        )
    )
);

另外,我的注册表单有一个名为 passwordConfPassword (confirm) 字段。我想检查用户在输入用户表之前是否正确输入了密码,但我不知道该怎么做。我猜在我的注册方法的某个地方我需要检查两个密码是否相同。

感谢您的帮助。

【问题讨论】:

为什么不设置您的数据库,以便用户表要求用户名/电子邮件是唯一的,并且不允许您插入不符合该要求的行?你在用 mysql 吗? 我刚刚在我的用户表中添加了两个唯一键,一个用于用户名,另一个用于电子邮件。然而,现在 Cake 只是抛出一个 SQL 错误而不是一个好的错误消息。我确信在应用程序中有一种方法可以做到这一点,我只是不知道如何并且无法在 Cake 文档中找到它。无论哪种方式,谢谢,无论如何,这些唯一键应该已经添加了:) 【参考方案1】:

isUn​​ique 规则适用于您的用户名和电子邮件字段。下面是一个代码示例,展示了如何在每个字段中使用多个规则:

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;

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于带有 CakePHP Auth 组件的唯一用户名和电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP Auth 如何允许特定的控制器和动作

具有两个模型会话的 Cakephp 身份验证组件

未找到CakePhp 3插件身份验证适配器

使用 CakePHP 'Acl' 组件

cakephp : 使用 $validate 数组验证登录表单

CakePHP 3 Auth注销 - 错误:未找到身份验证适配器“loginAction”