7

如何注册 CakePHP?

注册后会发邮件确认。

如果我单击链接进行确认,则该帐户将被确认。

我怎样才能做到这一点?

Auth 有什么功能可以做到这一点吗?

还是我必须手动发送邮件以确认注册?

如果我必须手动发送电子邮件以确认注册,那么如何生成注册令牌,以及如何将时间设置为有效令牌?

任何人都可以举一个例子吗?

4

4 回答 4

4

检查 Cake Development Corporations 用户插件的来源,它可用于 CakepPHP 1.3 和 2.0。https://github.com/cakedc/users它已经完成了你所要求的一切——以适当的 MVC 和 CakePHP 方式。只需使用插件或获取一些代码。

于 2011-10-13T10:00:14.020 回答
3

用户表:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8_persian_ci NOT NULL,
  `password` varchar(255) COLLATE utf8_persian_ci NOT NULL,
  `email` varchar(100) COLLATE utf8_persian_ci NOT NULL,
  `created` datetime NOT NULL,
  `status` tinyint(1) NOT NULL,
  `activation_code` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=4 ;

当用户注册时,你可以在activation_code字段中设置一个唯一的字符串(示例:md5(time())或任何东西......)。现在向用户发送这样的 url 电子邮件:

http://test/controller/action/activation_code

现在您必须检查您的操作,该激活码是否在用户表中。

如果是,那么状态=禁用与否....

于 2011-10-12T10:45:35.333 回答
2

您可以轻松地在 PHP 中生成像令牌一样的哈希码,并通过时间戳验证它的持续时间。对于电子邮件,只需像这样使用电子邮件组件。如果您想使用 Auth 组件,请确保您的表单为您提供正确的密码哈希值。

function register() {
    $error = false;
    $error_captcha = null;
    if(isset($this->data)){
        App::import('Component','Generate');
        App::import('Component', 'Converter'); 
        App::import('Component','Email');
        if(empty($this->data['User']['password'])||strlen($this->data['User']['password'])<5){
            $this->User->invalidate("password");
            $error = TRUE;
        }
        if($this->data['User']['password']<>$this->data['Temp']['password']){
            $this->User->invalidate("seotitle");
            $error = TRUE;
        }       
        $captcha_respuesta = recaptcha_check_answer ($this->captcha_privatekey,
        $_SERVER["REMOTE_ADDR"],
        $_POST["recaptcha_challenge_field"],
        $_POST["recaptcha_response_field"]);
        if ($captcha_respuesta->is_valid && !$error) {
        $this->data['User']['coderegistration'] = $this->generate->getUserCode();
        $this->data['User']['displayname'] = $this->data['User']['firstname'] . " " . $this->data['User']['lastname'];
        $this->data['User']['seotitle'] =  $this->converter->seotitle($this->data['User']['username']);
        $this->data['User']['password'] =  md5($this->data['User']['username'].$this->data['User']['password']);
        $this->User->id = NULL;
        if($this->User->save($this->data)){
            /*
            =========================
            send email notification
            =========================
            */
            $email = $this->data['User']['email'];              
            $content = sprintf('<a href="%s/%s">here</div>', $this->url, $this->data['User']['coderegistration']);
            $this->email->to = $email; 
            $this->email->subject = 'you have been registered, please confirm'; 
            $this->email->replyTo = 'mail@mail.com'; 
            $this->email->from = "name <mail@mail.com>";                
    $this->email->template = 'notification'; 
            $this->email->sendAs = 'html';
        $this->set('value', $content);  
        if($this->email->send()){
                // OK                   
        }else{
            trigger_error("error Mail");
        }
        }




        }else{
           $error_captcha = $captcha_respuesta->error;
           $this->set('error_email',true);
        }



    }
    $this->setTitlePage();
    $this->layout = "home";
    $this->set('backurl', '/');
    $this->set('posturl','');
    $this->set('captcha_publickey',$this->captcha_publickey);

    }
于 2011-10-12T01:38:47.270 回答
2

要发送电子邮件,还要加载电子邮件组件。给定的注册功能已经很好了,您应该使用它。

基本概念是添加用户,然后创建一个令牌(带有时间戳)并将其保存到数据库中,然后发送一封电子邮件,其中包含指向该令牌的链接。

然后,当用户单击指向您设置 user = active 的令牌的链接时,他们现在已注册并可以登录。

因此,对您的 Auth 的一个很好的提示是向 Auth 添加一个“范围”(查看 cakephp 文档以了解 1.3)。将此范围设为 active = 1 的条件。这样他们将需要从电子邮件链接中确认,并且在完成之前永远无法登录。简单的!

于 2011-10-12T11:34:11.407 回答